在原始范围内运行回调函数

时间:2013-07-18 16:35:26

标签: javascript jquery callback

我喜欢将我的javascript分离到类文件中。我最近遇到过需要能够通过点表示法为另一个javascript文件访问函数提供回调函数,因为函数是对象的一部分。

因此,例如,如果我有一个名为MyObject的对象,并且它有一个名为doS​​omething的函数,我想要为doSomething函数进行回调,但是我在另一个类文件中创建了该对象的实例,而我将我的回调传递给类文件,它在该范围内运行,而不是在原始文件的范围内。

FirstObject = function(options){

    var FirstObject = this;
    FirstObject.something = "somevalue";

    FirstObject.MyObject = new MyObject();
    FirstObject.MyObject.doSomething(param1, function(){//I need to be able to reference FirstObject.something here});
}

我知道我可以通过在第二个事件中触发事件来完成此操作,例如:$(document).trigger("doSomething-Finished")并在原始文档中监听,但我希望能够更直接地访问。我觉得它必须是可能的,因为这适用于jQuery回调。

我在这个问题上看到了答案:scope when doing OO javascript callbacks

但我真的不明白他在解决方案中究竟做了什么,以及如何针对我的具体情况实施它。

2 个答案:

答案 0 :(得分:1)

您可以在回调函数上使用ES5“bind”方法,以确保正确设置所需的范围,请参阅MDN documentation

FirstObject = function(options){

    var FirstObject = this;
    FirstObject.something = "somevalue";

    FirstObject.MyObject = new MyObject();

    var callback = function (){
        // "this" will be a reference to FirstObject, thanks to "bind" call below
    };

    FirstObject.MyObject.doSomething(param1, callback.bind(FirstObject));
}

保持对FirstObject的引用的另一种方法是简单地使用依赖注入。 下面是使用构造函数注入的示例,但您也可以使用setter函数:

FirstObject = function(options){

    var FirstObject = this;
    FirstObject.something = "somevalue";

    // pass FirstObject to sub object constructor
    // note that MyObject needs to store the reference for later use
    FirstObject.MyObject = new MyObject(FirstObject);


    FirstObject.MyObject.doSomething(param1, function(){//I need to be able to reference FirstObject.something here});
}

答案 1 :(得分:0)

您可以将函数绑定到对象:

FirstObject = function(options){

    var FirstObject = this;
    FirstObject.something = "somevalue";

    FirstObject.MyObject = new MyObject();
    FirstObject.MyObject.doSomething(param1, callback_function.bind(FirstObject.something));

    function callback_function(){
      // this will be FirstObject.something here
    }
}