Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS在传递函数之前绑定函数的上下文_Javascript_Closures - Fatal编程技术网

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

Javascript JS在传递函数之前绑定函数的上下文,javascript,closures,Javascript,Closures,我试图设置一个存储回调的函数,该回调可以在以后的事件中触发,但我没有正确绑定上下文。设置基本上如下所示: app.myObject = function(){ this.bindEvents(); }; app.myObject.prototype = { bindEvents: function(){ var self = this; this.library = new OutsideLibrary(); this.library.onMyEvent = fu

我试图设置一个存储回调的函数,该回调可以在以后的事件中触发,但我没有正确绑定上下文。设置基本上如下所示:

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
的内部,如果这是您想要的,则此
引用了
app.myObject
的一个实例。

Andrew,我认为您在这里可能尝试得太多了

如果您只想绑定上下文,则可以执行以下操作之一:

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”方法)更长一些,但如果您正在定义一行中的内容,我这里提供的可能就是您所需要的全部


只需确保在包装函数中不要使用
(无论是将其保存到var还是直接传递到另一个函数),因为它将引用
窗口

我无法在此处传递上下文
您不能使用
调用(上下文)吗
调用
runCallback
的语法?据我所知,
.call()
立即执行函数,而我需要传递它,但尚未执行,以便
其他库
在完成其内容后将执行它。这就是IE的问题:您认为某个功能受支持,但它从来都不受支持;)哈。在我的辩护中,这实际上是我大脑的一个问题,因为我刚刚通过电子邮件处理完一个XHR问题,没有麻烦切换回事件处理程序模式。虽然IE完全应该为没有做正确的事情而受到责备,并且为惊人的修复XHR和事件/回调而受到责备,但我应该关注我正在处理的事情。嘿,诺格卫尔,你说得对,我已经考虑过了。谢谢你的意见。我将实际使用zeroflagL的方法(这让我想打自己的头…),但我真的很感谢你的例子!别担心。它们都是一模一样的硬币。创建一个使用变量的函数,该变量在定义函数的任何范围内都可用,然后对其调用方法。有时候你可能需要变得更复杂一点,但实际上,它们很少。是的,就是这么简单。