Javascript call() & apply() vs bind()?

新手上路,请多包涵

我已经知道 applycall 是设置 this (函数的上下文)的类似函数。

不同之处在于我们发送参数的方式(手动与数组)

问题:

但是我什么时候应该使用 bind() 方法?

var obj = {
  x: 81,
  getX: function() {
    return this.x;
  }
};

alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));

jsbin

原文由 Royi Namir 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 780
2 个回答

我刚才在函数对象、函数调用、 call/applybind 之间创建了这个比较:

在此处输入图像描述

.bind 允许您 现在 设置 this 值,同时允许您 在将来 执行该函数,因为它返回一个新的函数对象。

原文由 Felix Kling 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 .bind() 当您希望稍后在特定上下文中调用该函数时,在事件中很有用。使用 .call().apply() 当您想立即调用该函数并修改上下文时。

Call/apply 立即调用该函数,而 bind 返回一个函数,该函数在稍后执行时将为调用原始函数设置正确的上下文。这样您就可以在异步回调和事件中维护上下文。

我经常这样做:

 function MyObject(element) {
    this.elm = element;

    element.addEventListener('click', this.onClick.bind(this), false);
};

MyObject.prototype.onClick = function(e) {
     var t=this;  //do something with [t]...
    //without bind the context of this function wouldn't be a MyObject
    //instance as you would normally expect.
};

我在 Node.js 中广泛使用它进行异步回调,我想为其传递一个成员方法,但仍然希望上下文是启动异步操作的实例。

bind 的一个简单、天真的实现如下:

 Function.prototype.bind = function(ctx) {
    var fn = this;
    return function() {
        fn.apply(ctx, arguments);
    };
};

它还有更多内容(比如传递其他 args),但您可以阅读更多关于它的信息并 在 MDN 上 查看真正的实现。

原文由 Chad 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题