【问题标题】:Why do we need "var self = this" in classes in Javascript?为什么我们在 Javascript 的类中需要“var self = this”?
【发布时间】:2012-07-19 14:32:17
【问题描述】:

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

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

回复后,我了解到:

可以,如果类中没有上下文切换就不需要了。

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

【问题讨论】:

    标签: javascript json knockout.js


    【解决方案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);
    }
    

    【讨论】:

    • setTimeout 是否在构造函数中运行?还是类的方法?
    • @ozz:参见window.setTimeout 的文档;它会将提供的函数的执行延迟指定的毫秒数。
    • 更不用说,setTimeout 还允许你传递一个参数。即jsfiddle.net/gRoberts/rYB3f,在您的示例中,无需将this 重新声明为self
    • @Gavin: 不幸的是不是 x 浏览器(例如 IE)。
    • 呃,很好看。我敢肯定它曾经是,但它似乎不是。感谢您指出马特。
    【解决方案2】:

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

    您将在以下文章中找到更多详细信息: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)

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

        【讨论】:

        • 虽然你在技术上当然是正确的,但像这样的答案让我有点麻烦:jQuery != javascript!用 jQuery 语法回答一个广泛的 javascript 问题可能会让初学者感到困惑。
        • 你的权利,然而,初学者很少学习原生 javascript,他们倾向于在谷歌搜索解决方案,在大多数情况下导致使用 jQuery。这是一把双刃剑。如果我给出了一个原生 javascript 示例,那么只知道基于 jQuery 的 javascript 的人会感到困惑。
        • JQuery 是原生 javascript。虽然它不是原生 DOM 处理。困惑很深。
        • 我知道这是六岁,但第二个例子中的“自我”在哪里?
        • @DJClayworth - 在上面的例子中,var btn = $(this); 是自我。最终,您需要在当前范围内创建 this 的副本,然后再在另一个范围内使用它(例如,在 ajax 响应中,this 是完全不同的东西。)HTH?
        猜你喜欢
        • 2015-06-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2019-06-09
        • 2021-06-09
        • 2020-12-17
        • 2014-06-30
        相关资源
        最近更新 更多