[英]JS bind the context of a function before passing
我正在尝试设置一个函数,该函数存储可以在事件以后触发的回调,但是我没有正确绑定上下文。 设置基本上是这样的:
app.myObject = function(){
this.bindEvents();
};
app.myObject.prototype = {
bindEvents: function(){
var self = this;
this.library = new OutsideLibrary();
this.library.onMyEvent = function(data) {
OtherLibrary.processData(data, self.runCallback); // I'm not able to pass a context here...
}
},
sendToLibrary: function(message,callback) {
this.callback = callback;
this.library.send(message);
}
// ... and this doesn't work because it gets evaluated in the wrong context.
runCallback: function() {
if (this.callback) {
this.callback();
this.callback = null;
}
}
}
我希望上面的代码有意义。 我的想法是,我正在尝试公开一个我可以调用的API:
app.myObject.sendToLibrary("something", function() {...});
...并且回调函数将在整个链完成后运行。
问题是,我无法直接通过sendToLibrary
接收的回调,因为在事件触发时需要将回调传递给另一个对象。 另外,由于我必须存储当前传递的回调,并且该回调是可选的,因此一旦触发它,我需要取消设置它,因此实际上我需要传递runCallback
函数以运行一次回调,然后将其取消设置。
无论如何,问题在于,当runCallback
最终被执行时,它不再处于正确的上下文中,因此它不起作用。 我要解决此问题的第一个想法是将runCallback
函数更改为包含上下文参数,因此我可以传递self.runCallback(self)
,但是它立即执行,因此无法达到目的。
无论如何,我在这里的回调树林中迷路了,希望能有帮助找到我的出路:)
我的问题是:有没有一种方法可以包装回调函数和正确的上下文,而无需立即执行它,以便在最终触发时从正确的上下文中执行此操作?
谢谢!
OtherLibrary.processData(data, function() {
self.runCallback();
)};
然后里面runCallback
this
是指的一个实例app.myObject
,如果这是你想要的。
安德鲁,我想您在这里可能会有点太努力了。
如果您要做的只是绑定上下文,则可以执行以下操作之一:
var working_method = context.method.bind(context);
// bind is IE9+, and does something similar to the below
// or, from whatever scope your context/method are available in, define this function
var working_method = function () { context.method(); };
如果您需要参数,并且已经知道足迹:
var working_method = function (a, b, c) { context.method(a, b, c); };
可变参数长度的解决方案(即:广义的“绑定”方法)更长,但是如果您要按行定义内容,那么您所需要的就是这里。
只要确保不要在包装函数中使用this
(无论是将其保存到var中,还是将其直接传递到另一个函数中),因为它将引用window
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.