我是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
失败了,因为它无法找到我传递的函数。
我该如何解决这个问题?申请\电话?不熟悉那些......
谢谢,我希望我的问题有道理......
答案 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