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

时间:2012-07-20 10:08:38

标签: javascript json knockout.js

为什么我们不能在以下示例中直接使用this而不是self

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

经过回复,我得知:

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

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

4 个答案:

答案 0 :(得分:23)

没有的原因你不能直接在那里使用this(我会说如果你做了,它的可读性会更好。)< / p>

但是,在以下情况下经常需要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);
}

答案 1 :(得分:7)

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

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

答案 2 :(得分:5)

在您的示例代码中,根本没有理由将this复制到变量。

通常在代码使用回调方法时使用。回调方法this内部没有引用该对象,因此您可以使用该变量。

答案 3 :(得分:3)

根据您的示例,“没有”这样做的原因。

然而,有些情况会对你有所帮助,虽然有些人可能不赞成使用它。

即。

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