У меня есть эта скрипка с ошибкой -> http://jsfiddle.net/Osoascam/AkZZr/6/
(Это версия без ошибки) -> http://jsfiddle.net/Osoascam/AkZZr/7/
В нем есть Модуль (как и основное приложение), Module.AjaxInterface
, который имеет дело с вызовами Ajax, 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 у меня есть это:
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
, чтобы сохранить его, но я действительно хочу по-настоящему понять, что происходит, и создать элегантное решение.