我有同样的问题,然后找到了答案,如下:
真的是为了
(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势必会像以前一样全局对象。