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

时间:2013-03-15 20:02:27

标签: javascript closures

我正在尝试设置一个存储回调的函数,该函数可以在以后的事件中触发,但我没有得到正确绑定的上下文。设置基本上是这样的:

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) - 但是会立即执行,因此它会失败。

无论如何,我有点迷失在这里的回调林中,并希望找到一些帮助找到出路:))

我的问题是:有没有办法结束回调函数和正确的上下文,而不是现在执行它,这样当它最终触发它时,它是从正确的上下文中完成的?

谢谢!

2 个答案:

答案 0 :(得分:1)

OtherLibrary.processData(data, function() {
    self.runCallback();
)};

然后在runCallback this内部引用app.myObject的实例,如果这是您想要的。

答案 1 :(得分:1)

安德鲁,我想你可能会在这里尝试一下。

如果您要查找的内容是绑定上下文,则可以执行以下操作之一:

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); };

变量参数长度的解决方案(即:广义" bind"方法)更长,但如果你在线定义东西,我在这里得到的可能就是全部你需要。

请确保在包装函数中不使用this(无论是将其保存到var还是直接传递给另一个函数),因为它将引用window