Javascript 绑定问题
Javascript problems with bind
我是 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
失败,因为它找不到我传递的函数
我该如何解决这个问题? apply\call ?不熟悉那些...
谢谢,我希望我的问题有意义...
每次调用 .bind
时都会得到一个新的引用,因此 "register" 和 "unregister" 阶段将不匹配,因为您没有传递完全相同的引用。
因此每个对象都需要保留其绑定处理程序的副本,例如:
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);
};
我是 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
失败,因为它找不到我传递的函数
我该如何解决这个问题? apply\call ?不熟悉那些...
谢谢,我希望我的问题有意义...
每次调用 .bind
时都会得到一个新的引用,因此 "register" 和 "unregister" 阶段将不匹配,因为您没有传递完全相同的引用。
因此每个对象都需要保留其绑定处理程序的副本,例如:
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);
};