求解这两个输出区别?

constGreeters=[]
for(vari=0;i<10;i++){
Greeters.push(function(){returnconsole.log(i)})
}
Greeters[0]()//10
Greeters[1]()//10
Greeters[2]()//10
constGreeters=[]
for(leti=0;i<10;i++){
Greeters.push(function(){returnconsole.log(i)})
}
Greeters[0]()//0
Greeters[1]()//1
Greeters[2]()//2
第二个用let后面不应该是undefined吗。。还有为什么Greeters数组里保存的是[function(){returnconsole.log(i)},function(){returnconsole.log(i)},...,function(){returnconsole.log(i)}]而不是[function(){returnconsole.log(0)},function(){returnconsole.log(1)},...,function(){returnconsole.log(9)}]?
拉丁的传说
浏览 326回答 2
2回答

慕姐8265434

典型面试题,变量生命周期问题,for循环问题和函数形参问题。let和var的不同,var是在当前代码块结束之后仍然在内存保留该变量和值,而let则是不保留,直接回收。而for循环输出是等到循环全部结束。所以第一种全部都是10。而第二种方式不是undefined呢,很简单,用到了闭包,注意这里返回的不是值,而是函数,如果第二种直接输出,那就是undefined,但是现在返回函数,我们还记得函数的形参吗,没错,函数调用时形参是对实参的一个复制,所以在输出时实参虽然被回收了,但是形参还保留了值。所以JS中循环取值和输出的最简单解决方式就是闭包。

莫回无

第一种情况,我觉得相当于这样:vari;functionprint(){returnconsole.log(i);}constGreeters=[]for(i=0;i
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript