我有一个情况,我有一个对象“foo”,它需要调用另一个对象“bar”的回调,并且我需要回调中的上下文是“bar”的上下文。但更重要的是,除了从“bar”获得回调之外,“foo”不应该知道任何关于它的信息。
例子:
var foo =
{
message: "Hello foo",
doStuff: undefined
};
var bar =
{
message: "Hello bar",
callback = function ()
{
alert(this.message);
}
};
foo.doStuff = bar.callback;
foo.doStuff();
我知道通常你会使用“call”或“apply”将上下文切换到 bar 但在我的特殊情况下,在调用 foo.doStuff()
时我不再有有关回调来自何处的信息。那么是否有另一种确定上下文的方法(比如从回调函数本身内部)?
最佳答案
So is there another way of figuring the context (say from within the callback function itself)?
没有。在传递回调之前,并非没有一些额外的细节。如果您只有一个函数引用,那么您通常没有上下文。但是通过一些准备,有一些解决方案。
您可以包装回调。当它被调用时,bar.callback()
将以其完整形式被调用,保留 bar
的上下文。
foo.doStuff = function() { bar.callback(); };
或者在现代 JS 引擎中,您可以将回调绑定(bind)到特定上下文。
foo.doStuff = bar.callback.bind(bar);
或者使用underscore.js在所有 JS 引擎中执行此操作。
foo.doStuff = _(bar.callback).bind(bar);
或者,如果您希望与旧引擎兼容并且不想为其使用整个库,则可以创建自己的绑定(bind)函数。
var bind = function(fn, context) {
return function() {
fn.call(context);
};
};
foo.doStuff = bind(bar.callback, bar);
总而言之,简单的包装器通常是最简单和最常见的。它几乎没有缺点,它速度快、易于理解,并且可以让您充分控制用什么参数调用什么。在这种情况下,我认为这种形式最有意义。
foo.doStuff = function() { bar.callback(); };
关于javascript - 从 Javascript 回调中的对象获取上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13500384/