Зачем нам "var self = this" в классах в Javascript?
Почему мы не можем напрямую использовать this
вместо self
в следующем примере?
function SeatReservation(name, initialMeal) {
var self = this;
self.name = name;
self.meal = ko.observable(initialMeal);
}
После ответов я узнал:
Да, нет необходимости, если в классе нет переключателя контекста.
Но я буду использовать этот подход как "соглашение", хотя в этом нет необходимости.
Ответы
Ответ 1
Там нет причина, по которой вы не можете использовать this
прямо там (и я бы сказал, что было бы лучше читать, если бы вы это сделали).
Тем не менее, var self = this;
часто требуется в таких ситуациях, как следующее (в основном, любое асинхронное действие, такое как привязка события, обработчики AJAX и т.д., где разрешение this
отложено до тех пор, пока оно не станет чем-то другим);
function SeatReservation(name, initialMeal) {
var self = this;
self.name = name;
self.meal = ko.observable(initialMeal);
setTimeout(function () {
alert(self.name); // otherwise, this is window; use self to keep a reference to the "SeatReservation" instance.
}, 100);
}
Ответ 2
Обычно это делается, чтобы сохранить ссылку на это при изменении контекста. Он часто используется в обработчиках событий или обратных вызовах. Но, как упоминалось ранее, нет причин использовать его в вашем конкретном примере.
Более подробную информацию вы найдете в следующей статье: http://www.alistapart.com/articles/getoutbindingsituations
Ответ 3
В вашем примере кода нет никакой причины копировать this
в переменную.
Обычно используется, когда код использует метод обратного вызова. Внутри метода обратного вызова this
не ссылается на объект, поэтому вы используете для этого переменную.
Ответ 4
Основываясь на вашем примере, для этого нет "причины".
Однако существуют ситуации, когда это вам поможет, хотя некоторые могут недооценивать его использование.
то есть.
$('a.go').click(function(e)
{
e.preventDefault();
if(!$(this).hasClass('busy'))
{
$(this).addClass('busy');
$.ajax(
{
success : function(resp)
{
$(this).removeClass('busy');
},
error : function()
{
$(this).removeClass('busy');
}
});
}
});
В приведенном выше примере $(this)
в пределах успешных и обратных вызовов ошибок не будет отражать ссылку, которую вы нажали, по мере того, как область была потеряна.
Чтобы обойти это, вы бы сделали var self = $(this)
i.e.
$('a.go').click(function(e)
{
e.preventDefault();
if(!$(this).hasClass('busy'))
{
$(this).addClass('busy');
var btn = $(this);
$.ajax(
{
success : function(resp)
{
btn.removeClass('busy');
},
error : function()
{
btn.removeClass('busy');
}
});
}
});