我得到的代码总是给出相同的结果:
var number = 0;
function a(){
number++; //outside return function
return function(){
return number;
};
}
var b = a(); //outside loop
for(i=0;i<10;i++){
console.log("loop: "+(i+1)+" :"+b());
}
我找到了这个解决方案(1):
var number = 0;
function a(){
number++; //outside return function
return function(){
return number;
};
}
for(i=0;i<10;i++){
var b = a(); //inside loop
console.log("loop: "+(i+1)+" :"+b());
}
显然我应该得到“正确”的解决方案(2):
var number = 0;
function a(){
return function(){
number++; //inside return function
return number;
};
}
var b = a(); //outside loop
for(i=0;i<10;i++){
console.log("loop: "+(i+1)+" :"+b());
}
在解决方案1中:我认为通过将var b放在for循环中,它会在每个循环中使用var编号,并且因为每个循环都添加了1 .
在解决方案2中:我不明白为什么应该将数字添加到return函数以使其循环 . I.m.o.整个a()函数就像原始问题一样运行,而不仅仅是返回方法中的代码?显然不是,为什么?
3 回答
在第一个版本中,
a()
仅被调用一次,因此number++
仅被调用一次 . 在第二个版本中,每次迭代都会调用a()
,因此每次迭代都会调用number++
. 所以在第一个版本中b
始终是相同的功能,而在第二个版本中,每次调用a()
时都会得到一个新函数 .在(2)中,函数a的执行返回一个函数 . 每次执行此功能时,都会将1添加到全局变量编号中 .
它和你写的时候一样:
初始情况下的问题是,您只需通过调用
a()
一次增加一次数,然后返回一个只返回数字的函数 . 每当你拨打b()
时,它将返回始终为1的数字 .在第一个解决方案中,您在每次迭代中调用
a()
,这将增加数字 . 然后函数b
将返回由a
递增的数字 .在第二个解决方案中,您基本上让
a
生成一次函数,然后调用每次迭代b()
,它们都更新并返回数值 .我希望这能澄清你遇到的问题 .