繁体   English   中英

JS在传递之前绑定函数的上下文

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM