回到课程

解释 "this" 的值

重要程度: 3

在下面的代码中,我们试图连续调用 obj.go() 方法 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; // 计算函数表达式
    f();        // 调用

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

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

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

除了方法调用之外的任何操作(如赋值 =||),都会把它转换为一个不包含允许设置 this 信息的普通值。