區域範疇 Block-scoping
為何需要block-scoping: ES5以前,只有全作用域跟函式作用域。這樣的情形會有以下問題。
- 內部宣告的變數有可能因提升後,覆蓋到外部的同名變數:例子中內部的tmp會影響外部的tmp值,使得執行f()會undefined

- 函式中用來計數的循環變數會成為全域變數:例子中的i並不會因計數結束而消失

ES6增加了block-scoping的機制,並分別對此作用域的變數跟常數訂定了宣告的關鍵字let&const。只要在某層block({ })中,以這兩個關鍵字宣告的變數,只會作用在此block裡,並不會影響到此block以外的運算。
let基本:例子中的兩個block都宣告變數n,但內部的n不影響外部console.log(n)的結果
let適用於for計數器
const宣告此block裡的常數,並不會隨block裡的運算改變其值
- 用
let跟const宣告的變數或常數,需明確指派值後才能使用
Block-scoping的特性:
- 可取代立即執行的匿名函式

- 函式本身的作用域限制在其所在的block中:例子中,ES5函式可以提升,所以不管有沒有進到if的blck中,內部的f()都會提升到當前作用域並且執行;而ES6會讓內部宣告的函式不會影響到外部的作用域

參考資料: ECMAScript6入門(中文)