JS中的let和var有什么區別?怎么用?

JavaScript 中,let 和 var 的主要區別在于作用域變量提升和重復聲明。1. let 是塊級作用域,而 var 是函數作用域;例如,在 if 塊中用 let 聲明的變量無法在外部訪問,var 則可以。2. var 存在變量提升,即變量可在聲明前訪問但值為 undefined,而 let 不會提升,提前訪問會報錯。3. var 允許重復聲明變量,而 let 在同一作用域下不可重復聲明。4. 推薦優先使用 let,因其更安全且符合現代編程習慣,var 一般用于舊項目或需要函數作用域的場景,如 for 循環中使用 let 可避免閉包問題。

JS中的let和var有什么區別?怎么用?

在 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 的存在更多是為了兼容老代碼。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享