繁体   English   中英

为什么我们在Javascript中的类中需要“var self = this”?

[英]Why do we need “var self = this” in classes in Javascript?

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

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

回答后,我了解到:

是的,没有必要在课堂上没有上下文切换。

但我会将这种方法用作“惯例”,尽管没有必要。

没有理由你不能直接在那里使用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);
}

通常这样做是为了在上下文发生变化时保持对此的引用。 它通常用于事件处理程序或回调函数。 但如前所述,没有理由在您的具体示例中使用它。

您将在以下文章中找到更多详细信息: http//www.alistapart.com/articles/getoutbindingsituations

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

它通常在代码使用回调方法时使用。 在回调方法中, this不会引用该对象,因此您可以使用该变量。

根据你的例子,这是“没有”理由。

但是,有些情况会对你有所帮助,尽管有些人可能会对它的使用感到不满。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM