让我们看一下这个例子:
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行)。这令人困惑。
答案 0 :(得分:1)
在每种情况下,从4到7只返回函数,而不是上下文。所以当你从对象中抓取函数时,它会丢失它的上下文。然后它会尝试调用函数,其中的this
引用全局对象,即窗口和x
in窗口是3.所以在use strict
模式下它将为null,在其他模式下它将是窗口。
4)将右手值分配给左手值并将其返回
(obj.test = obj.test)()
5)如果第一个操作数为true,则返回它,否则返回第二个操作数
obj.test || obj.test
6)如果第一个和第二个操作数为true,则返回第一个操作数,否则返回第二个操作数
obj.test && obj.test
7)在这种情况下,它只返回第二个对象。 ,
逗号仅将对象彼此分开
(obj.test, obj.test)()