这两条线的区别?

时间:2015-06-21 21:45:28

标签: javascript

使用obj.loc++代替this.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变量将始终引用一个汽车对象。这是什么意思?

3 个答案:

答案 0 :(得分:2)

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

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

如果您使用obj,则始终为obj,与move的调用方式无关。

答案 1 :(得分:0)

这是来自Udacity面向对象的JavaScript课程的视频。在讲师面前教授我们关于this关键字的一些课程。

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

这就是区别,@ Oriol是对的。

答案 2 :(得分:0)

首先,您已经理解,无论您使用# Objective (including the constant term): mod$value + sum(Quw*ruw^2) # [1] 9.14478 matrix(mod$solution, nrow=R) # [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] # [1,] 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.3215992 0.1818095 0.1818095 0.1818095 0.000000e+00 # [2,] 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 # [3,] 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 2.775558e-17 # [4,] 0.5728478 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 # [5,] 0.5728478 0.5111456 0.5111456 0.4699046 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 # [6,] 0.5728478 0.5111456 0.5111456 0.4699046 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 # [7,] 0.5728478 0.5111456 0.5111456 0.4699046 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 # [8,] 0.5728478 0.5111456 0.5111456 0.5111456 0.4346995 0.4346995 0.4346995 0.2882339 0.2882339 0.000000e+00 # [9,] 0.5728478 0.5111456 0.5111456 0.5111456 0.4346995 0.4346995 0.4346995 0.4346995 0.2882339 1.110223e-16 # [10,] 0.5728478 0.5111456 0.5111456 0.5111456 0.4346995 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 # [11,] 0.6298100 0.5111456 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 # [12,] 0.6298100 0.5111456 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 # [13,] 0.6298100 0.5111456 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 # [14,] 0.6298100 0.5111456 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 # [15,] 0.6298100 0.6009718 0.5111456 0.5111456 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 # [16,] 0.6298100 0.6009718 0.6009718 0.6009718 0.4518205 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 # [17,] 0.6298100 0.6009718 0.6009718 0.6009718 0.6009718 0.4346995 0.4346995 0.4346995 0.4346995 0.000000e+00 # [18,] 0.6298100 0.6009718 0.6009718 0.6009718 0.6009718 0.6009718 0.4346995 0.4346995 0.4346995 0.000000e+00 # [19,] 0.6298100 0.6009718 0.6009718 0.6009718 0.6009718 0.6009718 0.4346995 0.4346995 0.4346995 0.000000e+00 # [20,] 0.6298100 0.6009718 0.6009718 0.6009718 0.6009718 0.6009718 0.5643033 0.5643033 0.5643033 0.000000e+00 还是this.loc,结果都没有差异。

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

说明:您应该了解this.loc++有两个重要的背景。

  1. 全局上下文:在全局执行上下文中(在任何函数之外),这指的是全局对象,无论是否处于严格模式。因为不是你的情况,所以我们不要挖掘。
  2. 函数上下文:在函数内部,其值取决于函数的调用方式。在非严格模式中,this的值必须始终是一个对象,因此它默认为全局对象。在严格模式中,此值保持为进入执行上下文时设置的值。如果没有定义,它仍然是未定义的。它也可以设置为任何值,例如null或42或“我不是这个”。
  3. 阅读this from MDN以获取更详细的说明。

    现在,无论您是以严格模式还是非严格模式运行,无论您是使用this还是this,都会看到相同的结果,因为当您使用obj时然后再次成为您的功能背景,并在this上访问loc

    现在,谈论约定,假设有另一个名为this的全局变量,当你在loc函数中使用this.loc++;时,仍然carlike将在函数上下文中运行并且会增加this loc函数,但可读性较差,至少对新手来说,是否会增加全局carlike或本地loc

    所以,使用loc 总结是一个更好的主意。