JavaScript 中令人困惑的作用域和自调用
Confusing scope and self invocations in JavaScript
我们来看这个例子:
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 到 7 在每种情况下它 return 只是功能,而不是上下文。因此,当您从对象中获取函数时,它会丢失 context.And 然后它会尝试调用该函数,其中的 this
指的是全局对象,即 window 和window 中的 x
是 3。因此在 use strict
模式下它将为空,在其他模式下它将是 window.
4) 将右边的值分配给左边的值,然后 return 它
(obj.test = obj.test)()
5)如果第一个操作数为真,return它,否则return第二个操作数
obj.test || obj.test
6)如果第一个和第二个操作数为真,return第一个操作数,否则return第二个操作数
obj.test && obj.test
7) 在这种情况下它只有 return 第二个对象。 ,
逗号只是将对象彼此分开
(obj.test, obj.test)()
我们来看这个例子:
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 到 7 在每种情况下它 return 只是功能,而不是上下文。因此,当您从对象中获取函数时,它会丢失 context.And 然后它会尝试调用该函数,其中的 this
指的是全局对象,即 window 和window 中的 x
是 3。因此在 use strict
模式下它将为空,在其他模式下它将是 window.
4) 将右边的值分配给左边的值,然后 return 它
(obj.test = obj.test)()
5)如果第一个操作数为真,return它,否则return第二个操作数
obj.test || obj.test
6)如果第一个和第二个操作数为真,return第一个操作数,否则return第二个操作数
obj.test && obj.test
7) 在这种情况下它只有 return 第二个对象。 ,
逗号只是将对象彼此分开
(obj.test, obj.test)()