我喜欢将我的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回调。
我在这个问题上看到了答案:scope when doing OO javascript callbacks
但我真的不明白他在解决方案中究竟做了什么,以及如何针对我的具体情况实施它。
答案 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
}
}