如果你直接這麼運行,那麼電腦就卡死了,因爲死循環了。
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