Javascript函数绑定覆盖(如何将其绑定到另一个对象)

时间:2015-07-27 15:02:48

标签: javascript function bind

有没有办法通过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

我知道我可以使用不同的方法并保持“干净”的绑定功能,但我只是想知道如何重用已绑定的函数。

2 个答案:

答案 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。闭包内变量的值只能从闭包内部更改,因此没有什么办法可以解除绑定绑定函数。你必须从原来的功能开始。

所以,没有