Подтвердить что ты не робот

Зачем нам "var self = this" в классах в Javascript?

Почему мы не можем напрямую использовать this вместо self в следующем примере?

function SeatReservation(name, initialMeal) {
    var self = this;
    self.name = name;
    self.meal = ko.observable(initialMeal);
}

После ответов я узнал:

Да, нет необходимости, если в классе нет переключателя контекста.

Но я буду использовать этот подход как "соглашение", хотя в этом нет необходимости.

4b9b3361

Ответ 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');                
            }
        });
    }
});