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 就抓不到了。
for
loop 應全面使用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 的window
object,但let
不會- 實務上建議全面使用
let
取代var
Sample Code
完整的範例可以在我的 GitHub 上找到