我觉得自己像个初学者。我不太明白为什么这两个代码表现不同。有人可以解释一下吗?我觉得我在这里想念一些JS机制。
代码1:
function Car(){
var miles = 0;
function drive(dist){
miles = miles+dist;
}
return {
drive:drive,
miles:miles
}
}
var car = new Car;
car.drive(50);
代码2:
function Car(){
var miles = 0;
function drive(dist){
miles = miles+dist;
}
return {
drive:drive,
miles:function(){
return miles;
}
}
}
var car = new Car;
car.drive(50);
因此它就像code1一样,JS为里程创建了一个新的范围/闭包/任何......值。也许聪明的人可以为这种行为提供一些背景知识。
答案 0 :(得分:4)
JavaScript按值复制。
在第一个例子中:
miles
变量为0
。miles
属性中包含0
的副本。miles
变量已更新(现在为50
)。miles
属性(仍为0
)。在第二个例子中:
miles
变量为0。miles
属性包含一个返回miles
变量值的函数。miles
变量已更新(现在为50
)。miles
函数并返回miles
变量(50
)的值。答案 1 :(得分:-1)
第一个代码是按原样返回变量里程数,它正在被更新但是没有被读取,因为它在一个闭包中,就像Quentin提到的那样,第二个代码返回一个返回一个叫做getter的变量的函数在Javascript中,您已经创建了自己的getter函数,返回更新后的值,您可以在此处阅读有关getter函数的更多信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects。
简而言之,第一个代码返回一个变量里程,第二个代码返回一个返回变量里程的getter函数miles()。我希望有帮助:)
如果您尝试这样的事情:
代码3
function Car()
{
var miles = 0;
function drive(dist)
{
return miles += dist;
}
return {
drive: drive,
miles: miles
};
}
var car = new Car();
car.drive(50); // returns 50 and not undefined
这样当调用car.drive(50)时,你不会得到一个未定义的函数,因为函数返回一个值。