绑定的Javascript问题

绑定的Javascript问题,javascript,javascript-objects,Javascript,Javascript Objects,我是JS新手,不知道为什么bind会给我带来麻烦: 以下是一个片段: var MyTest = function() { registerChannel(address, null, this._messageHandler.bind(this)); }; MyTest.prototype._messageHandler = function(msg) { this._logToConsole(msg); }; MyTest.prototype._close = fu

我是JS新手,不知道为什么bind会给我带来麻烦:

以下是一个片段:

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
你会得到一个新的引用,所以“注册”和“取消注册”阶段不会匹配,因为你传递的引用不完全相同

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

var MyTest = function() {
  this._handler = this._messageHandler.bind(this);
  registerChannel(address, null, this._handler);
};
然后,您可以将此._handler传递给您的
unregisterChannel
调用

另一种方法是根本不在
原型上放置
\u messageHandler
,而是在构造函数中创建一个新实例:

var MyTest = function() {

  this._messageHandler = (function(msg) {
     ...
  }).bind(this);

  registerChannel(address, null, this._messageHandler);
};

每次调用
.bind
都会得到一个新引用,因此“注册”和“取消注册”阶段将不匹配,因为传递的引用不完全相同

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

var MyTest = function() {
  this._handler = this._messageHandler.bind(this);
  registerChannel(address, null, this._handler);
};
然后,您可以将此._handler
传递给您的
unregisterChannel
调用

另一种方法是根本不在
原型上放置
\u messageHandler
,而是在构造函数中创建一个新实例:

var MyTest = function() {

  this._messageHandler = (function(msg) {
     ...
  }).bind(this);

  registerChannel(address, null, this._messageHandler);
};

“应用”或“调用”在这种情况下也有帮助吗?@Shvalb不,它们不应用(没有双关语)-它们实际上调用函数,而不是创建可通过的引用。谢谢!你帮了我很多!“应用”或“调用”在这种情况下也有帮助吗?@Shvalb不,它们不应用(没有双关语)-它们实际上调用函数,而不是创建可通过的引用。谢谢!你帮了我很多!