Мне нравятся полнофункциональные, языковые агностические ответы от таких людей, как @Arak. Поскольку этот вопрос был помечен JavaScript , хотя я хотел бы отметить некоторые примечания, очень специфичные для этого языка.
В javascript наши выборки для определения области видимости:
var _this = this; function callback(){ console.log(_this); }
callback.bind(this)
Стоит отметить, Я думаю, что JavaScript на самом деле не имеет динамического охвата . .bind
настраивает ключевое слово this
, и это близко, но технически не то же самое.
Вот пример, демонстрирующий оба подхода. Вы делаете это каждый раз, когда принимаете решение о том, как обрабатывать обратные вызовы, чтобы это применимо к обещаниям, обработчикам событий и т. Д.
что вы могли бы назвать Lexical Scoping
обратных вызовов в JavaScript:
var downloadManager = {
initialize: function() {
var _this = this; // Set up `_this` for lexical access
$('.downloadLink').on('click', function () {
_this.startDownload();
});
},
startDownload: function(){
this.thinking = true;
// request the file from the server and bind more callbacks for when it returns success or failure
}
//...
};
Другой способ охвата - использовать Function.prototype.bind
:
var downloadManager = {
initialize: function() {
$('.downloadLink').on('click', function () {
this.startDownload();
}.bind(this)); // create a function object bound to `this`
}
//...
Эти методы, насколько мне известно, поведенчески эквивалентны.