为什么我们需要“变种自我=这”在JavaScript类?(Why do we need “var s

2019-07-30 12:55发布

为什么我们不能直接使用this ,而不是self在下面的例子吗?

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

之后的反应,我已经学会:

是的,有没有必要,如果有类没有上下文切换。

但我会用这种方法,因为“公约”,虽然没有必要。

Answer 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);
}


Answer 2:

它通常是为了保持一个参考这个当上下文正在改变完成。 它通常在事件处理程序或回调函数使用。 但正如前面提到的,没有理由在你的具体的例子来使用它。

你会发现下面的文章中更多的细节: http://www.alistapart.com/articles/getoutbindingsituations



Answer 3:

在您的示例代码没有理由在所有复制this一个变量。

当代码使用的回调方法它通常使用。 里面的回调方法this不引用对象,所以你使用变量为。



Answer 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)

$('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');                
            }
        });
    }
});


文章来源: Why do we need “var self = this” in classes in Javascript?