ES6新增了let
命令,用來聲明變量。它的用法類似于var
,但是所聲明的變量,只在let
命令所在的代碼塊內有效。
for (let i = 0; i < 10; i++) {console.log(i);}
可以執行
for (let i = 0; i < 10; i++) {}console.log(i);
就會報錯
ncaught ReferenceError: i is not definedat <anonymous>:3:13at Object.InjectedScript._evaluateOn (<anonymous>:145:167)at Object.InjectedScript._evaluateAndWrap (<anonymous>:137:25)at Object.InjectedScript.evaluate (<anonymous>:118:14)
let var使用區別:
var:
var a = []; for (var i = 0; i < 10; i++) {a[i] = function () {console.log(i);}; } a[6]();
結果:
10
變量i
是var
聲明的,在全局范圍內都有效,所以全局只有一個變量i
。每一次循環,變量i
的值都會發生改變,而循環內被賦給數組a
的function
在運行時,會通過閉包讀到這同一個變量i
,導致最后輸出的是最后一輪的i
的值,也就是10。
let:
var a = []; for (let i = 0; i < 10; i++) {a[i] = function () {console.log(i);}; } a[6]();
結果:
6
變量i
是let
聲明的,當前的i
只在本輪循環有效,所以每一次循環的i
其實都是一個新的變量,所以最后輸出的是6。
?
for
循環還有一個特別之處,就是循環語句部分是一個父作用域,而循環體內部是一個單獨的子作用域。
不存在變量升級:
// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;// let 的情況
console.log(bar); // 報錯ReferenceError
let bar = 2;
VM171:2 undefined
報錯:
VM171:6 Uncaught ReferenceError: bar is not definedat <anonymous>:6:13at Object.InjectedScript._evaluateOn (<anonymous>:145:167)at Object.InjectedScript._evaluateAndWrap (<anonymous>:137:25)at Object.InjectedScript.evaluate (<anonymous>:118:14)(anonymous function) @ VM171:6InjectedScript._evaluateOn @ VM68:145InjectedScript._evaluateAndWrap @ VM68:137InjectedScript.evaluate @ VM68:118
?