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