Три простых примера кода:
1. Создаем указатель на объект
var App = {
// Свойство
name: 'Alex',
// Асинхронный метод
asuncFunc: function () {
var deferred = $.Deferred();
setTimeout(function () {
deferred.resolve();
}, 5000);
return deferred.promise();
},
// Обработчик (тут нужно обратится к свойству)
say: function () {
var app = this;
app.asuncFunc().done(function () {
console.log(this); // Deferred
console.log(app.name);
});
}
}
2. Во втором варианте мы сохраняем контекст в обработчике
var App = {
// Свойство
name: 'Alex',
// Асинхронный метод
asuncFunc: function () {
var deferred = $.Deferred();
setTimeout($.proxy(deferred, 'resolveWith', this), 5000);
return deferred.promise();
},
// Обработчик (тут нужно обратится к свойству)
say: function () {
this.asuncFunc().done(function () {
console.log(this); // App
console.log(this.name);
});
}
}
3. Используем глобальный объект (при условии что он один и не дублируется)
var App = {
// Свойство
name: 'Alex',
// Асинхронный метод
asuncFunc: function () {
var deferred = $.Deferred();
setTimeout(function () {
deferred.resolve();
}, 5000);
return deferred.promise();
},
// Обработчик (тут нужно обратится к свойству)
say: function () {
App.asuncFunc().done(function () {
console.log(this); // Deferred
console.log(App.name);
});
}
}
Какой из трех вариантов работы с контекстом наиболее правильный? Какие особенности в плане производительности и т.д.?