绑定的Javascript问题
我是JS新手,不知道为什么bind会给我带来麻烦: 以下是一个片段:绑定的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
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不,它们不应用(没有双关语)-它们实际上调用函数,而不是创建可通过的引用。谢谢!你帮了我很多!