現在被廣為使用的 JavaScript 在 1995 年是一個百家爭鳴的語言,許多廠商 (像是:微軟、NetScape) 為了爭取市場佔有率,而開發出各式各樣獨特的語法、功能,導致有些網頁在不同的瀏覽器上會有不同顯示效果,甚至完全無法顯示。於是在 1997 年出現了 ECMA-262 標準化 JavaScript 的語法,而所謂的 ES6 就是指 ECMAScript 2015,下圖是 JavaScript 的進化史:
ES5、ES6 都是 JavaScript 的版本,相較 ES5 以前版本的語法,ES6 改變了一些語法讓寫法更精簡,不只新增了非同步專用的 Promise、ES6 Modules、Classes,也出現新的變數型態宣告方式解決變數污染的問題。今天要講的是 ES6 版本中的變數宣告方式有什麼改變~詳細的 ES6 版本教學可以看這個網站。
在 ES6 前,JavaScript 用 var
來宣告變數,乍看之下 var 本身並沒有什麼問題,但其實隱藏著變數汙染的隱憂。因為用var
會把變數自動宣告為全域變數,所以如果同一份程式文件有兩個用 var
宣告的相同名稱變數時就會互相影響雙方的值,就算其中一個變數被包在迴圈或流程控制區塊內也一樣會被汙染。
假設在迴圈內外分別宣告兩個變數 i,兩個變數雖然名稱相同但功能不同:
var i = 1;
for (var i=0; i<5; i++){
console.log("迴圈執行次數:"+ i);
}
console.log(i);
從上面範例可以看到即使是在迴圈內宣告的i不但是全域變數,其值還會影響本來要印出的i值。所以在 ES6 版本後,增加了 let、const 兩種變數宣告的方法,用新方式宣告的變數只會在大括號{}區域中有效,不會自動變成全域變數。
用法和 var
類似,但是不允許重複宣告相同變數,不然會出現 SyntaxError 錯誤。且變數宣告的範圍只受區塊作用域(Block Scope)內影響,使用範例如下:
var i = 1;
for (let i=0; i<5; i++){
console.log("迴圈執行次數:"+ i);
}
console.log(i);
將迴圈內的var
宣告方式改成let
,最後印出的 i 值就不會被迴圈內的 i 值影響。
如果兩個 i 的變數宣告方式都改成 let
,會出現語法錯誤,因為 let
不允許重複宣告相同名稱的變數:
const
和let
一樣可以用來宣告一個只會在大括號內作用的變數,但是用 const 宣告的變數指向的值不能再被改變,不然會出現 TypeError 錯誤。
for (const i=0; i<5; i++){
console.log("迴圈執行次數:"+ i);
}
從上面的範例可以看出,第一次 i=0 是成立的,因為用 const 宣告的值只能等於 0 不能被改變。但執行第二次迴圈時 i 值要被加 1,所以出現 TypeError 錯誤讓 i 值維持在 0。