-1

让我们看一下这个例子:

var x = 3;

var obj = {
  x:2,
  test: function(){
    var x = 1;
    console.log(this.x);
  } 
};

然后我们有不同的方式来调用这个函数:

obj.test(); // line 1

obj.test.call(null); // line 2

(obj.test)(); // line 3

(obj.test = obj.test)(); // line 4

(obj.test || obj.test)(); // line 5

(obj.test && obj.test)(); // line 6

(obj.test, obj.test)(); // line 7

我理解前 3 行,但任何人都可以向我解释进一步发生了什么(第 4 到 7 行)。这很令人困惑。

4

1 回答 1

1

从 4 到 7 在每种情况下它只返回函数,而不是上下文。因此,当您从对象中获取函数时,它会丢失它的上下文。然后它会尝试调用该函数,其中thisin 引用全局对象,即窗口,x窗口中为 3。所以在use strict模式下它将是null,在其他模式下它将是窗口。

4)将右手的值赋给左手的值并返回

(obj.test = obj.test)()

5)如果第一个操作数为真,则返回它,否则返回第二个操作数

obj.test || obj.test

6)如果第一个和第二个操作数为真,则返回第一个操作数,否则返回第二个操作数

obj.test && obj.test

7)在这种情况下,它只返回第二个对象。,逗号仅将对象彼此分隔

(obj.test, obj.test)()
于 2016-10-26T11:07:51.063 回答