ES6的let在for循环经典问题如何起作用?

问题
在复习ES6的块级作用域时候又遇到了for循环的经典问题,即
vara=[];
for(vari=0;i<10;i++){
a[i]=function(){
console.log(i);
}
}
console.log(a[6]())//10
如何使得输出依次为1到9,使用ES6,一般这样做:
vara=[];
for(leti=0;i<10;i++){
a[i]=function(){
console.log(i);
}
}
console.log(a[6]())//6
我的误解
我认为上述答案也可以写成:
vara=[];
leti;
for(i=0;i<10;i++){
a[i]=function(){
console.log(i);
}
}
console.log(a[6]())//10
输出:10?和想象中不一样啊?为什么不是6?
我的理由
块级作用域是以{}标识的,for循环应该生成十个{}子块作用域
每个子块{}中关联的是相应的i,即每次循环的i值
let放在for语句内和for语句外部应该都在十个{}子块的外部吗?
请问我的错误出在哪里?
小怪兽爱吃肉
浏览 857回答 2
2回答

扬帆大鱼

错在理由第3点。let放在for语句内,作用域是在for内的每次循环内;定义在for语句外,作用域是外面的{}内。在for内let:每一次循环的i其实都是一个新的变量,JavaScript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript