你只是在使用逗号运算符。
这个运算符只会从左到右依次对其操作数求值,并返回第二个操作数的值,例如:
(0, 1); // 1
('foo', 'bar'); // 'bar'
在调用函数的上下文中,操作数的评估仅会获得一个值,而不是引用,这导致调用的函数内部的
this
值指向全局对象(或在新的ECMAScript 5严格模式下将为
undefined
)。
例如:
var foo = 'global.foo';
var obj = {
foo: 'obj.foo',
method: function () {
return this.foo;
}
};
obj.method();
(1, obj.method)();
如您所见,第一个调用是直接调用,
method
中的
this
值将正确地引用
obj
(返回
"obj.foo"
),第二个调用由逗号运算符进行评估,将使
this
值指向全局对象(产生
"global.foo"
)。
这种模式最近变得非常流行,可用于间接
调用eval
,例如在ES5严格模式下,这可能很有用,以获取对全局对象的引用,例如(假设您不在浏览器环境中,不存在
window
):
(function () {
"use strict";
var global = (function () { return this || (1,eval)("this"); })();
})();
在上述代码中,内部匿名函数将在严格模式下执行,导致该
this
值为
undefined
。
现在
||
运算符将采用第二个操作数,即
eval
调用,它将在全局词法和变量环境中评估代码,这是一种间接调用。
但就个人而言,在此情况下,我更喜欢使用
Function
构造函数来获取全局对象。
(function () {
"use strict";
var global = Function('return this')();
})();
Function
构造函数创建的函数仅在其以 Use Strict Directive 开头时为严格模式,它们不像函数声明或函数表达式一样“继承”当前上下文的严格性。