【发布时间】:2011-11-16 16:01:49
【问题描述】:
我有这个有错误的小提琴 --> http://jsfiddle.net/Osoascam/AkZZr/6/ (这是没有错误的版本)--> http://jsfiddle.net/Osoascam/AkZZr/7/
其中有一个模块(如主应用程序)、一个处理 Ajax 调用的Module.AjaxInterface、一个处理与电子邮件收件箱相关的任务的Module.Modules.Inbox 和一个处理多个显示页面的模块。所有这些都是使用模块模式完成的。
现在,您可以看到有很多回调。我想知道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()。现在,在pretendRender 我有这个:
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 来保留它,但我真正想要的是真正了解正在发生的事情并创建一个优雅的解决方案。
【问题讨论】:
标签: javascript callback this module-pattern