如果你直接这么运行,那么电脑就卡死了,因为死循环了。
for (var i = 0; i < 3; i++) {
var i = 1;
console.log(i);
}
可是如果你这么写
for (let i = 0; i < 3; i++) {
let i = 1;
console.log(i);
结果则是:
1
1
1
如果你这么写,结果同上
for (var i = 0; i < 3; i++) {
let i = 1;
console.log(i);
}
如果你这么写,会报错
for (let i = 0; i < 3; i++) {
var i = 1;
console.log(i);
} // SyntaxError: Identifier 'i' has already been declared
这是因为let在for循环语句中是父作用域。循环体内部是子作用域。
所以如果我们用let在for循环体内部用i定义变量的话,那么妈妈再也不用担心我敲电脑敲出死机了。
当然如果你在循环体内部直接运用i也是可以的,这样 i 会直接运用到子作用域。
for (let i = 0; i < 3; i++) {
console.log(i);
}
如果你这么写,也是会报错,因为对于var来讲它是不会区分循环体内部和循环语句的变量作用域的。
for (let i = 0; i < 3; i++) {
var i = 0;
console.log(i);
} // SyntaxError: Identifier 'i' has already been declared
再写个let在块级作用域的例子,我们一起来感受下:
{
let i = 0;
if (true) {
let i = 2;
console.log(i);
}
console.log(i);
}
结果:
2
0