18

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

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

回复后,我了解到:

是的,如果类中没有上下文切换,则不需要。

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

4

4 回答 4

27

没有理由你不能直接在那里使用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);
}
于 2012-07-20T10:12:15.513 回答
8

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

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

于 2012-07-20T10:14:47.947 回答
5

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

它通常在代码使用回调方法时使用。回调方法内部this不引用对象,因此您为此使用变量。

于 2012-07-20T10:14:41.737 回答
2

根据您的示例,这样做是“没有”理由的。

然而,在某些情况下它会对您有所帮助,尽管有些人可能不赞成使用它。

IE

$('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');                
            }
        });
    }
});
于 2012-07-20T10:14:09.000 回答