绑定的Javascript问题

Javascript problems with bind

本文关键字:问题 Javascript 绑定      更新时间:2023-11-13

我是JS的新手,在弄清楚绑定为什么会给我带来问题时遇到了问题:

以下是一个片段:

var MyTest = function() {
  registerChannel(address, null, this._messageHandler.bind(this));
};
MyTest.prototype._messageHandler = function(msg) {      
   this._logToConsole(msg); 
};
MyTest.prototype._close = function() {
  (function(inst) {
    asyncSend(address, data, 
      function(err, reply) {
        unregisterChannel(address, inst._messageHandler.bind(inst));
      }
    );
  })(this);
}

registerChannel方法存储我传递的回调函数,unregisterChannel尝试验证此回调是否存在并失败,因为"bind"复制了该方法,但没有将其作为引用传递(据我所知)。

结果是unregisterChannel失败了,因为它找不到我传递的函数。

我该如何解决这个问题?申请''呼叫?不熟悉那些。。。

谢谢你,我希望我的问题有意义。。。

每次调用.bind时,都会得到一个新的引用,因此"注册"answers"注销"阶段将不匹配,因为您没有传递完全相同的引用。

因此,每个对象都需要保留其绑定处理程序的自己的副本,例如:

var MyTest = function() {
  this._handler = this._messageHandler.bind(this);
  registerChannel(address, null, this._handler);
};

然后您可以将this._handler传递给您的unregisterChannel呼叫。

另一种选择是根本不将_messageHandler放在prototype上,并在构造函数中创建一个新实例:

var MyTest = function() {
  this._messageHandler = (function(msg) {
     ...
  }).bind(this);
  registerChannel(address, null, this._messageHandler);
};