ECMAScript 之 Let
ECMAScript 2015 是 JavaScript 歷史上最重要的一次升級,也讓 JavaScript 終於趕上主流程式語言的高度,若要明顯的分辨 ES5 與 ES6,最明顯的方式的方式就是看有沒有使用 let。
Verson
ECMAScript 2015
Let
宣告變數於 block {} 內。
var宣告變數於 function 內或 function 外 (global)
Scope
scope01.js
1 | function varTest() { |
ES5 與 ES6 都可執行。
實際執行為
1 | function varTest() { |
因為 Hoisting,var x 被移到最上層,scope 為 function 內,因此離開 if (true) 仍然為 2。
scope02.js
1 | function letTest() { |
ES5 沒有 let 無法執行。
第 4 行
1 | if (true) { |
使用 let 後,其 scope 為 block {},只有在 {} 為 2,離開 {} 就變回 1。
以主流程式語言而言,變數的 scope 都是 block
{},而非 function,因此 ECMAScript 的let較符合大家的習慣,如此就可如 C# 一樣,將變數宣告在程式碼要用的地方,而不是宣告在 function 最前面,因此 TC39 建議全面使用let取代var
scope03.js
1 | var a = 1; |
第 9 行
1 | console.log(b); // 22 |
因為 let b = 22,為 block level。
13 行
1 | console.log(b); // 2 |
因為 var b = 2,為 global level。
scope04.js
1 | function foo(cnt) { |
var 為 function level,因此 for loop 執行完還存在。
scope05.js
1 | function foo(cnt) { |
let 為 block level,超出 for loop 就抓不到了。
forloop 應全面使用let避免 Side Effect
scope06.js
1 | var x = 'global'; |
var 與 let 雖然都可建立 global 變數,但 var 會污染 DOM 的 window object,但 let 不會。
若要使用 global 變數,應全面使用
let取代var
Redeclaration
redeclaration01.js
1 | var x = 2; |
ES5 與 ES6 都可以執行。
var 允許對變數重複宣告。
redeclaration02.js
1 | let x = 2; |
ES5 與 ES6 都無法執行。
let 不允許對變數重複宣告。
redeclaration03.js
1 | function foo(x) { |
ES5 與 ES6 都可執行。
實際執行時
1 | function foo(x) { |
因為 var 會 Hoisting,所以允許 redeclaration。
redeclaration04.js
1 | function foo(x) { |
若將 var 改成 let,則 ES5 與 ES6 都無法執行。
因為 let 認 {} 為 scope,不允許 redeclaration。
redeclaration05.js
1 | function foo(x) { |
在每個 case 加上 {},則可以 redeclaration。
Conclusion
var為 function level 或 global level;而let為 block levelvar的 global 變數會污染 DOM 的windowobject,但let不會- 實務上建議全面使用
let取代var
Sample Code
完整的範例可以在我的 GitHub 上找到