回到课程

解释 "this" 的值

重要程度: 3

在下面的代码中,我们试图连续调用 4 次 user.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).method() 调用。这个调用就像被分成了两行(代码)一样:

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

这里的 f() 是作为一个没有(设定)this 的函数执行的。

  1. (3) 相类似,在点 . 的左边也有一个表达式。

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

除了方法调用之外的任何操作(如赋值 =|| 等)把它变为了一个没有设定 this 信息的普通值。