我的 JS 代码大致是这样的:
function myObject()
{
this.a = 13;
this.fetchData = function()
{
alert(this.a);
getData(this.processData);
}
this.processData = function(data)
{
// do stuff with data
alert(this.a);
}
this.fetchData();
}
function getData(callback)
{
// do async request for data and call callback with the result
}
我的问题是:函数 fetchData 可以通过 this 关键字访问我的 a 变量,但是另一个函数 processData 在被 getData 调用时不会。我明白为什么会发生这种情况,但不知道如何解决。
您如何最好地以 OOP 风格解决这个问题? (函数 getData 必须可用于多个类)
最佳答案
两种选择:
1) 让 getData
接受上下文参数(通常称为 context
或 thisArg
)并使用 callback.apply(context, ...)
或 callback.call(context, ...)
来调用它。所以:
function getData(callback, context) {
// ...when it's time to call it:
callback.call(context, arg1, arg2);
// or
callback.apply(context, [arg1, arg2]);
}
2) 创建一个函数,该函数在被调用时将返回并调用原始回调,并将 this
设置为正确的值。 (这有时称为“绑定(bind)”。)
例如,使用显式闭包:
this.fetchData = function()
{
var self = this;
alert(this.a);
getData(getDataCallback);
function getDataCallback(arg1, arg2) {
self.processData(arg1, arg2);
}
}
或者有一个通用的 bind
函数来完成它(这也将涉及一个闭包,但在一个很好的受控上下文中,所以它不会关闭你不需要的东西)。有关简单 bind
函数的示例,请参见下面的链接。
关于javascript - 异步 JavaScript 和对象持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4991019/