JavaScript 宣告方式
Javascript 中有三種宣告的保留字:var、let、const:
var: 函式作用域,最早出現的宣告方式,宣告與賦值可分開進行。
(因為可重複宣告,導致難以追蹤、維護,此宣告方式現已逐漸被取代)let: 區塊作用域,ES6 引入,適合一般變數,宣告與賦值可分開進行。const: 區塊作用域,ES6 引入,常數,宣告與賦值須一起完成。
(這是現代 JS 最推薦的方法)
作用域的概念可以參考:【JavaScript 入門:作用域 Scope 和作用域鏈 Scope chain】
作用域 Scope
可以把作用域理解為「活著的範圍」,超出這個範圍,變數就無法起作用,甚至可以說對範圍外的人來說根本不存在!
var是函式作用域,也就是只有函式擋得住這種變數,若是將宣告寫在if或for之中,變數會跑出去,變成變數外洩。let/const是區塊作用域,只要有{}就可以擋住,不須擔心外洩問題。
function test() {
if (true) {
var a = 5;
let b = 6;
const c = 7;
console.log(a); // 5,可正常印出
console.log(b); // 6,可正常印出
console.log(c); // 7,可正常印出
}
console.log(a); // 5,可正常印出
// console.log(b); // ReferenceError: b is not defined
// console.log(c); // ReferenceError: c is not defined
}
test();
重宣告 Redeclear
var可以重宣告,因為這個特性,使得用 var 宣告的變數不易追蹤,可能重複宣告了都沒發現><let/const不可以重宣告。
var a = 1;
var a = 2;
console.log(a);// 2
/*------------------------*/
let a = 1;
let a = 2; // SyntaxError: Identifier 'a' has already been declared
console.log(a);
/*------------------------*/
const a = 1;
const a = 2; // SyntaxError: Identifier 'a' has already been declared
console.log(a);
重賦值 Reassign
var/let可以重賦值const不可以重賦值
var a = 1;
a = 2;
console.log(a); // 2
/*------------------------*/
let a = 1;
a = 3;
console.log(a); // 3
/*------------------------*/
const a = 1;
a = 5; // TypeError: Assignment to constant variable.
console.log(a);
提升 Hoisting
「提升」指的是,JavaScript 引擎在執行程式碼前,先將「宣告」搬到作用域最上方的動作。(只有宣告會提升,賦值這個動作是留在原地的喔!)var/let/const 皆會提升,但是處理的方式不一樣:
var會被初始化為 undefined,不會報錯。let/const 會進入 temporal dead zone(暫時性死區),會出現錯誤。
console.log(a); // undefined
var a = 0;
/*------------------------*/
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 0;
/*------------------------*/
console.log(c); // ReferenceError: Cannot access 'c' before initialization
let c = 0;
關於更詳細的「提升」介紹,可以參考:【JavaScript 入門:提升 Hoisting 是什麼?】
總結
參考


















