我有同样的问题,然后找到了答案,如下:
真的是为了
(0, foo.fn)();
请记住,在 JavaScript 中,whenfoo.fn()
被调用,然后在 内部fn
,this
绑定到foo
。如果你使用
var g = foo.fn;
g();
然后当g
上面调用时,this
被绑定到全局对象(window
,在 Web 浏览器的上下文中)。
那么你需要g
像上面那样定义吗?你能做一些诸如
(foo.fn)();
答案是不。JavaScript的对待它一样foo.fn();
,因为它只是foo.fn
有剩余()
,可以删除。
但是有一种方法可以解决它,那就是使用逗号运算符,Mozilla 表示为
逗号运算符计算其每个操作数(从左到右)并返回最后一个操作数的值
所以使用
(0, foo.fn)();
在(0, foo.fn)
将得到评估,以向功能的引用,像g
上面,然后将调用该函数。然后,this
不是绑定到foo
全局对象而是绑定到全局对象。
所以这样写的代码,就是“剪断绑定”。
例子:
var foo = {
fullName: "Peter",
sayName: function() { console.log("My name is", this.fullName); }
};
window.fullName = "Shiny";
foo.sayName(); // My name is Peter
(foo.sayName)(); // My name is Peter
(0, foo.sayName)(); // My name is Shiny
现在为什么有些代码要切断绑定?在某些情况下,如果我们有一个函数,我会读到:
function foo() {
// using `this` here
}
然后this
将指向全局对象。但是如果foo()
与其他函数和值一起打包成一个module,那么在调用该函数时使用
someModule.foo();
那么this
必然someModule
,并且它改变了 的行为foo()
。因此,要保持foo()
为原来的,因为它是我们削减的结合,所以这里面foo()
,将this
势必会像以前一样全局对象。