在 JavaScript 中,let 和 var 的主要區別在于作用域、變量提升和重復聲明。1. let 是塊級作用域,而 var 是函數作用域;例如,在 if 塊中用 let 聲明的變量無法在外部訪問,var 則可以。2. var 存在變量提升,即變量可在聲明前訪問但值為 undefined,而 let 不會提升,提前訪問會報錯。3. var 允許重復聲明變量,而 let 在同一作用域下不可重復聲明。4. 推薦優先使用 let,因其更安全且符合現代編程習慣,var 一般用于舊項目或需要函數作用域的場景,如 for 循環中使用 let 可避免閉包問題。
在 JavaScript 中,let 和 var 都是用來聲明變量的關鍵字,但它們的行為和作用域有明顯區別。簡單來說:var 是函數作用域,而 let 是塊級作用域,并且不會被提升到作用域頂部。
下面從幾個實際開發中會遇到的場景來具體說明它們的區別和用法。
1. 作用域不同:這是最核心的區別
- var 聲明的變量是函數作用域,也就是說,在函數內部定義的 var 變量在整個函數內都有效。
- let 聲明的變量是塊級作用域,也就是只在最近的一對 {} 內部有效。
舉個例子:
if (true) { var a = 10; let b = 20; } console.log(a); // 輸出 10 console.log(b); // 報錯:ReferenceError: b is not defined
在這個例子里,a 是用 var 聲明的,它不受 if 塊的限制;而 b 是用 let 聲明的,只能在 if 塊里訪問。
2. 變量提升(Hoisting)行為不同
- var 聲明的變量會被“提升”到作用域頂部,賦值仍然保留在原地。
- let 聲明的變量不會被提升,訪問未聲明前的變量會報錯。
看個例子你就明白了:
console.log(x); // 輸出 undefined var x = 5; console.log(y); // 報錯:ReferenceError let y = 10;
這里 x 被提升了,所以輸出的是 undefined;而 y 是用 let 聲明的,訪問時還沒聲明,直接報錯。
這個區別在寫代碼時特別容易踩坑,尤其如果你習慣先使用變量再聲明的話。
3. 是否可以重復聲明
- 在同一個作用域下,var 允許重復聲明變量。
- let 不允許重復聲明,否則會報錯。
例如:
var name = "Tom"; var name = "Jerry"; // 合法 let age = 20; let age = 30; // 報錯:Identifier 'age' has already been declared
這在多人協作或大項目中能減少命名沖突的問題,也是推薦使用 let 的原因之一。
4. 使用建議:什么時候用 let,什么時候用 var?
雖然 let 出現得晚一些,但它更符合現代 JS 編程的習慣。以下是一些實用建議:
- 如果你寫的代碼需要塊級作用域、避免變量提升帶來的問題,就用 let。
- var 現在一般只用于舊項目維護,或者你想利用它的“函數作用域”特性(比如循環外訪問變量)。
- 一般來說,優先使用 let,除非你明確知道為什么要用 var。
補充一點小細節:
在 for 循環中使用 let 是很常見的做法,因為每次迭代都是獨立的作用域:
for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 100); } // 輸出 0, 1, 2 for (var j = 0; j < 3; j++) { setTimeout(() => console.log(j), 100); } // 輸出 3, 3, 3
這就是因為 let 每次循環都有一個獨立的變量副本,而 var 是共享的。
基本上就這些了。說到底,let 更安全、邏輯更清晰,適合大多數情況。而 var 的存在更多是為了兼容老代碼。