var
作用域:在 function 內宣告的只有在 function 內有用,在函式外宣告作用範圍為全域 global。
function count() {
var num = 400;
console.log(num); // 執行count() 會出現 400
};
count();
//console.log(num); // 報錯:num 未定義
var 的缺點,在一些區塊語句 (if、else、for、while) 使用 var 宣告的變數可能會污染全域變數。
for (var i = 0; i < 3; i++) {
console.log(i, "Hi"); // 依次出現 0 "Hi"、1 "Hi"、2 "Hi"
}
console.log(i);// 沒宣告全域 i 但會出現 3
在 ES6 的版本中推出了新的變數宣告關鍵字 let 和 const,不會有 var 的副作用。
let
作用域是區塊作用域 { } 包住的區域,離開 { } 就無法存取。
禁止同一層 Block 重複宣告變數
for (let x = 0; x < 3; x++) {
let y = 2;
//let y = 3; // 報錯:y 已宣告
//var y = 3; // 報錯:y 已宣告
console.log(x); // 0 1 2
}
console.log(x); // 報錯:x 未定義
const
const 可以視為 let 的常數加強版,let 有的特性 const 都有,但 const 額外多了常數保護的特性。
在宣告 const 時就必定要指定給值,不然會產生錯誤。而且指定後不能更改賦值。
const money = 100;
//money = 60; // 報錯:Assignment to constant variable
var:不會受限在代碼塊區域(block scope)內,可能會汙染全域變數。不管哪個作用域(Scope)都可以存取,可以重複宣告。
let:所宣告的變項只有在代碼塊區域(block scope)內有效,不會產生全域變數,無法在同一層 Block 重複宣告變數。
const:具備 let
所有的特性。在一宣告時就必定要指定給值,不然會產生錯誤,宣告後不能更改值。