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

标签 javascript arrays function this

我已经知道 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

最佳答案

当您希望稍后使用特定上下文调用该函数时使用 .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);
    };
};

还有更多内容(例如传递其他参数),但您可以阅读更多内容并查看实际实现 on the MDN .

关于Javascript call() & apply() vs bind()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15455009/

相关文章:

javascript - <select> 选择等于源数组的索引

javascript - jQuery 的 `$(this)` 为什么以及如何引用正确的节点?

javascript - 检查今天是否在日期数组中

python - 在 ndarray 中逐行计算唯一元素

c++ - 使用代码 :Blocks on Linux 的 C++ 函数中的 "Not Declared in scope"

javascript - 使用 ng-bind-html 在页面上显示 html 标签

python - numpy 将二维数组保存到文本文件

c - 将 glist 指针作为参数传递以反射(reflect)列表中的更改不起作用

python - 按列将函数应用于 Pandas 数据框

javascript - 如何在jquery html应用程序中使用wcf服务作为远程或本地?