我有这个拨弄它有一个错误 - > (这是没有错误的版本) - >http://jsfiddle.net/Osoascam/AkZZr/7/避免失去这个参考和使用它的原因
在这里面,有一个模块(如主要应用程序),处理Ajax调用的Module.AjaxInterface
,执行与电子邮件收件箱相关的任务的Module.Modules.Inbox
以及处理若干模块以显示页面的Module.Pages.Gmail
。所有这些都是使用模块模式完成的。
现在,你可以看到有很多回调。我想知道发生了什么this
上的呼叫:
我不明白的是发生了什么this
参考,我该如何维护它:
getMessages: function(params) {
var parameters = params || {};
params = {
// Please note I'm using this, which equals the module
successCallback: this.pretendRender,
successCallbackParameters: parameters,
json: params.json
};
var test = new Module.AjaxInterface(params);
test.ajaxCall();
},
因此,调用模块内部的函数本身工作...然后,它调用test.ajaxCalls
,该函数返回调用pretendRender()
。现在,pretendRende
R I有这样的:
pretendRender: function(data, parameters) {
// LINE 106 that is causing the ERROR
// It says "this.addColor() is not defined and THIS = window now
data.color = this.addColor();
parameters.successCallback(data);
},
addColor: function() {
return "#AD9";
}
我的问题是...什么是发生在this
参考?为什么会更改为window
?我该如何解决它?我知道我可以使用call
或apply
,但函数pretendRender
在AjaxInterface
上被调用,并且对Modules.Inbox
的引用已经丢失(除非我使用caller
,我不能在"strict"
下)。我知道我可以通过this
到AjaxInterface
来保存它,但我真正想要的是真正理解正在发生的事情并创建一个优雅的解决方案。
嗯......我明白了......这不是我想要“这个”在回调中......我只需要一种方法来调用addColor()...并且它说它是未定义的,如果我只是将其保留为 –
您调用'this.addColor()',它将在'this'设置正确时起作用。所以:'successCallback:$ .proxy(this.pretendRender,this)'如果你使用的是jQuery是你需要改变的唯一东西,它应该工作..请看这里http://jsfiddle.net/AkZZr/8/。我这样做只是改变,它开始工作。 – Esailija
完美!非常感谢你! –