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

opt*_*tor 12 javascript bind function

有没有办法通过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
Run Code Online (Sandbox Code Playgroud)

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

Fel*_*ing 9

有没有办法通过Function.prototype.bind重新绑定已绑定到另一个对象的函数?

号从ES2015规范有关Function.prototype.bind:

19.2.3.2 Function.prototype.bind(thisArg,... args)

[...]

注意2:如果Target是箭头函数或绑定函数,则后续调用F将不会使用传递给此方法的thisArg.

对于早期版本也是如此.

  • `.bind` 似乎提供了一个非常强大的契约,即它保证无论函数如何调用,`this` 都会指向我定义的值。如果可以以某种方式再次更改“this”的值,“.bind”似乎就没那么有用了。 (3认同)
  • 您可以通过允许客户端通过参数提供接收器来手动执行此操作,并在未提供接收器的情况下使用默认接收器。仅仅因为语言在一个维度上是灵活的,并不一定意味着它在另一个维度上也是灵活的(实际上为什么会这样?!)。在这种情况下,考虑到接收者的控制可以在用户态中传递,接收者的非用户态保证是对语言的有用补充。 (2认同)

Poi*_*nty 7

是什么.bind()做的是几乎相同的:

function likeBind(fun, thisValue) {
  return function() {
    var args = [].slice.call(arguments, 0);
    return fun.apply(thisValue, args);
  };
}
Run Code Online (Sandbox Code Playgroud)

所以:

c = likeBind(c, a);
Run Code Online (Sandbox Code Playgroud)

给你一个绑定功能.现在,即使您尝试重新绑定,原始绑定函数仍然存在于该闭包中,并且具有您最初请求使用的值this.闭包内变量的值只能从闭包内部改变,因此没有什么办法可以解除绑定绑定函数.你必须从原来的功能重新开始.

所以,没有.