绑定的Javascript问题

时间:2016-04-01 17:27:16

标签: 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 = function() {

  (function(inst) {
    asyncSend(address, data, 
      function(err, reply) {
        unregisterChannel(address, inst._messageHandler.bind(inst));
      }
    );
  })(this);
}

registerChannel方法存储我传递的回调函数,unregisterChannel尝试验证此回调是否存在并失败,因为' bind'复制方法并没有将它们作为参考传递(据我所知)。

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

我该如何解决这个问题?申请\电话?不熟悉那些......

谢谢,我希望我的问题有道理......

1 个答案:

答案 0 :(得分:4)

每次调用 var d = new Date(); var month = d.getMonth(); var day = d.getDate(); var year = d.getFullYear(); $('#startdatetime-from').datetimepicker({ language: 'en', format: 'yyyy-MM-dd hh:mm' }); $("#startdatetime-from").data('datetimepicker').setLocalDate(new Date(year, month, day, 00, 01)); 时都会得到一个新的引用,因此“注册”和“注销”阶段将不匹配,因为您没有传递完全相同的引用。

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

.bind

然后您可以将var MyTest = function() { this._handler = this._messageHandler.bind(this); registerChannel(address, null, this._handler); }; 传递给this._handler来电。

另一种方法是不将unregisterChannel放在_messageHandler上,并在构造函数中创建一个新实例:

prototype