0

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

例如,如果我有一个名为 MyObject 的对象,它有一个名为 doSomething 的函数,我想为 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 回调。

我已经看到了这个问题的答案:做 OO javascript 回调时的范围

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

4

2 回答 2

1

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

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});
}
于 2013-07-18T17:01:50.780 回答
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
    }
}
于 2013-07-18T16:46:48.620 回答