这两条线的区别

Difference between these two lines?

本文关键字:区别 两条线      更新时间:2023-09-26

this.loc++ obj.loc++在第四行?

var carlike = function(obj, loc) {
    obj.loc = loc;
    obj.move = function() {
        this.loc++;
    };
    return obj;
};
var amy = carlike({}, 1);
amy.move();

这个视频中对此进行了一些解释,但我仍然不清楚这两者之间的区别。 https://www.youtube.com/watch?v=9oi0NY8Pen8

在这个视频中,有人说当我们使用 this.loc++ ,每次调用move时,它都会绑定到一个新值。但是当我们使用 obj.loc++ 时,每次我们调用 car carlike 函数时,都会创建一个新的闭包范围,因此 obj 变量将始终只引用一个 car 对象。什么意思?

如果使用 this ,则在调用它时设置其值:

amy.move();         // Called with this === amy
amy.move.call(foo); // Called with this === foo

如果你使用obj,它将永远是obj的,与move的调用方式无关。

这是

来自Udacity Object Oriented JavaScript课程的视频。在讲师教我们this关键字之前的一些课程。

this是指函数/方法的对象/调用方。通常是dot剩下的object。(在答案中@Oriol this被覆盖在特殊call函数中作为参数。

这确实是区别,@Oriol是对的。

首先,您已经正确理解,无论您使用 this.loc 还是obj.loc,结果都没有区别。

对您的问题的简短回答是,使用 obj.loc++ 而不是 this.loc++ 没有真正的直接优势或劣势。

说明:您应该了解 2 个重要的上下文this

    全局上下文
  1. :在全局执行上下文(在任何函数之外(中,这是指全局对象,无论是否处于严格模式。既然不是你的情况,那就不要挖了。
  2. 函数
  3. 上下文:在函数内部,此值取决于函数的调用方式。在非严格模式下,this 的值必须始终是一个对象,因此它默认为全局对象。在严格模式下,此值将保持在进入执行上下文时设置的任何值。如果未定义,则保持未定义状态。它也可以设置为任何值,例如 null 或 42 或"我不是这个"。

从 MDN 阅读本文以获取更详细的解释。

现在,在您的情况下,无论您是在严格模式还是非严格模式下运行,无论您是使用 this 还是obj您都会看到相同的结果,因为当您使用 this 时,它会再次成为您的函数上下文,您可以在this上访问loc

现在,谈到约定,假设有另一个名为 loc 的全局变量,当您在 carlike 函数中使用 this.loc++; 时,this仍然会在函数上下文中运行并将增加carlike函数的loc,但至少对于新手来说,无论是增加全局loc还是局部loc,可读性都很差。

因此,总结使用obj.loc++;是一个更好的主意。