具体 要先看 这个
然后看 这个
然后看 这个
也看看 这个
一扫而过 这个
个人理解:
下面的例子:
for (let i = 0; i < 10; i++) {
setTimeout(()=>console.log("i:",i), 1000);
}
// 去糖(desugar)之后的模拟代码
// 用区块符区分每次循环的语句
// 每次for语句开始,i指定为一个全域刻度__status,这只是方便说明而已
// __status会记录for语句i最后的值
{ let i;
i = 0;
__status = {i};
}
{ let {i} = __status;
if (i < 10)
setTimeout(()=>console.log("i:",i), 1000);
__status = {i};
}
{ let {i} = __status;
i++;
if (i < 10)
setTimeout(()=>console.log("i:",i), 1000);
__status = {i};
}
//...
对于 下面的情况
for (let i = 0; i < 3; console.log(i),i++) {
let i = 'a';
console.log(i);
}
// a a a
我觉得应该是:
{ let i;
i = 0;
__status = i;
}
{ let i = __status;
if (i < 10){
let i = 'a';
setTimeout(()=>console.log("i:",i), 1000);
}
__status = i;
}
{ let i = __status;
i++;
if (i < 10){
let i = 'a';
setTimeout(()=>console.log("i:",i), 1000);
}
__status = i;
}
// 至于这样组织的代码,for循环中的判断是怎么中断或者继续的?
// 会不会其实是判断嵌套
/*
i++;
if(i<10){
i++;
if(i<10){
i++;
if(i<10){
// 就像这样?一旦哪个判断不符合循环就不执行了
}
__status = i;
}
__status = i;
}
__status = i;
*/
es6写法 以及 babel转译后的代码:
for (let i = 0; i < 3; console.log(i),i++) {
let i = 'abc';
console.log(i);
}
/*-------------babel--------*/
for (var i = 0; i < 3; console.log(i), i++) {
var _i = 'abc';
console.log(_i);
}
// 证明for循环()中的i和{}中的i不在同一个作用域,实际上每次循环i都已经是一个新的变量
还有一个例子就是 这个 例子里面 eyesofkids 的 答案,我比较倾向于这种解释。与 这个 里面关于let在for循环中的解释差不多(但应该不是通过词法作用域,而是在{}里面再let i了一下)
最后附上 阮大的let说明 例子也不错 传送门