javascript - 从 Javascript 回调中的对象获取上下文

标签 javascript callback this

我有一个情况,我有一个对象“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/

相关文章:

javascript - 动态价格变化的问题

javascript - 溢出隐藏 - IE7 中的问题

javascript - 失败时的 Ajax 响应

javascript - 回调函数说明

c# - 回调时未修改 ASP.NET 隐藏字段值

java - 为什么不能在这里使用 'this' 关键字?

javascript - 使用 native javascript模拟按键

java - 匿名监听器是否与弱引用不兼容?

javascript - 为什么 this.firstName 返回未定义?

javascript - 加载事件后未设置 jQuery "this-reference"