有没有办法通过Function.prototype.bind重新绑定已绑定到另一个对象的函数?
var a={};
var b={};
var c=function(){ alert(this===a); };
c(); // alerts false
c=c.bind(a);
c(); // alerts true
c=c.bind(b);
c(); // still alerts true
我知道我可以使用不同的方法并保持“干净”的绑定功能,但我只是想知道如何重用已绑定的函数。
答案 0 :(得分:8)
有没有办法通过Function.prototype.bind重新绑定已绑定到另一个对象的函数?
没有。来自ES2015 spec关于Function.prototype.bind
:
19.2.3.2 Function.prototype.bind(thisArg,... args)
[...]
注2:如果 Target 是箭头函数或绑定函数,那么后续调用 F <时,将不会使用传递给此方法的 thisArg / em>的
对于早期版本也是如此。
答案 1 :(得分:6)
.bind()
的作用几乎与此相同:
function likeBind(fun, thisValue) {
return function() {
var args = [].slice.call(arguments, 0);
return fun.apply(thisValue, args);
};
}
所以:
c = likeBind(c, a);
为您提供绑定功能。现在,即使您尝试重新绑定,原始绑定函数仍然存在于该闭包中,并且您最初请求使用的值为this
。闭包内变量的值只能从闭包内部更改,因此没有什么办法可以解除绑定绑定函数。你必须从原来的功能开始。
所以,没有。