我有同样的问题,然后找到了答案,如下:
真的是为了
(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()与其他函数和值一起,被打包成一个模块,那么在调用函数时使用
someModule.foo();
然后this是必然的someModule,并且它已经改变了 的行为foo()。所以为了保持foo()原来的样子,我们剪掉了绑定,这样在里面,foo(),this就像以前一样绑定到全局对象。