使用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
变量将始终引用一个汽车对象。这是什么意思?
答案 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++
有两个重要的背景。
阅读this from MDN以获取更详细的说明。
现在,无论您是以严格模式还是非严格模式运行,无论您是使用this
还是this
,都会看到相同的结果,因为当您使用obj
时然后再次成为您的功能背景,并在this
上访问loc
。
现在,谈论约定,假设有另一个名为this
的全局变量,当你在loc
函数中使用this.loc++;
时,仍然carlike
将在函数上下文中运行并且会增加this
loc
函数,但可读性较差,至少对新手来说,是否会增加全局carlike
或本地loc
。
所以,使用loc
总结是一个更好的主意。