您只是在使用逗号运算符。
此运算符仅从左到右计算其操作数,并返回第二个操作数的值,例如:
(0, 1); // 1
('foo', 'bar'); // 'bar'
在调用函数的上下文中,对操作数的求值只会得到一个值,而不是引用,这会导致this
被调用函数内部的值指向全局对象(或者它将undefined
处于新的 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"
如您所见,第一次调用,这是一个直接调用,this
里面的值method
将正确引用obj
(返回"obj.foo"
),第二次调用,逗号运算符所做的评估将使this
值指向全局对象(yielding "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 指令开头时才是严格的,它们不会像函数声明或函数表达式那样“继承”当前上下文的严格性。