你只是在使用The Comma Operator。
该运算符只从左到右计算其操作数,并从第二个返回值,例如:
(0, 1); // 1
('foo', 'bar'); // 'bar'
在调用函数的上下文中,操作数的求值将简单地得到一个值,而不是一个引用,这导致被调用函数内的this值指向全局对象(或者它将是@987654330 @ 在新的 ECMAScript 5 严格模式下)。
例如:
var foo = 'global.foo';
var obj = {
foo: 'obj.foo',
method: function () {
return this.foo;
}
};
obj.method(); // "obj.foo"
(1, obj.method)(); // "global.foo"
如您所见,第一次调用是直接调用,method 中的this 值将正确引用obj(返回"obj.foo"),第二次调用,由逗号运算符将使this 值指向全局对象(产生"global.foo")。
这种模式最近变得非常流行,间接calls to 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 指令开头时才是严格的,它们不会像函数声明或函数表达式那样“继承”当前上下文的严格性。