返回课程

解释“this”的价值

重要性:3

在下面的代码中,我们打算连续调用 4 次 obj.go() 方法。

但是调用 (1)(2) 的方式与 (3)(4) 不同。为什么?

let obj, method;

obj = {
  go: function() { alert(this); }
};

obj.go();               // (1) [object Object]

(obj.go)();             // (2) [object Object]

(method = obj.go)();    // (3) undefined

(obj.go || obj.stop)(); // (4) undefined

以下是解释。

  1. 这是一个常规的对象方法调用。

  2. 相同,括号在这里不会改变操作顺序,点运算符始终优先。

  3. 这里我们有一个更复杂的调用 (expression)()。这个调用就像被分成两行一样工作。

    f = obj.go; // calculate the expression
    f();        // call what we have

    这里 f() 作为函数执行,没有 this

  4. (3) 相似,在左括号 () 的左侧,我们有一个表达式。

为了解释 (3)(4) 的行为,我们需要回顾一下属性访问器(点或方括号)返回的是引用类型的值。

对它的任何操作,除了方法调用(如赋值 =||),都会将其转换为普通值,它不包含设置 this 的信息。