ES6變量聲明:let、var、const全面解析

一、引言

? ? ? ECMAScript 6(簡稱 ES6)的發布為 JavaScript 帶來了許多革命性的變化,其中變量聲明方式的更新尤為重要。letvarconst成為開發者日常編碼中頻繁使用的關鍵字。

? ? ? 本文將深入解析這三種聲明方式的核心特性、區別及最佳實踐,幫助開發者更好地理解和使用 ES6 的變量聲明。

二、var:ES5 時代的主角

1. 函數作用域

var是 ES5 中唯一的變量聲明關鍵字,具有函數作用域特性。這意味著變量在聲明它的函數體內有效,在代碼塊(如iffor)中不會形成獨立作用域:

function example() {if (true) {var x = 10;}console.log(x); // 輸出 10,x 在函數作用域內有效
}
example();

在這個例子中,x 雖然是在 if 代碼塊中聲明的,但由于 var 具有函數作用域,所以在 if 代碼塊外部仍然可以訪問到 x

2.變量提升

var聲明的變量存在變量提升現象,即變量聲明會被提升到作用域頂部,賦值操作保留在原地:

console.log(y); // 輸出undefined(變量提升,但未賦值)
var y = 20;

在這個代碼中,雖然 y 的聲明在 console.log 之后,但由于變量提升,y 的聲明被提升到了作用域頂部,所以 console.log 不會報錯,只是輸出 undefined。

⑴.什么是作用域頂部

在 JavaScript 里,“作用域頂部” 指的是當前作用域的起始位置。JavaScript 引擎在執行代碼之前,會先對變量和函數的聲明進行處理,將它們 “提升” 到當前作用域的最開始部分,不過賦值操作并不會被提升。

①變量提升

JavaScript 中的變量提升允許你在變量聲明之前就使用它。下面是代碼示例:

console.log(y); // 輸出 undefined(變量提升,但未賦值)
var y = 20;

在上述代碼中,盡管 y 的聲明位于 console.log 之后,但由于變量提升,y 的聲明會被提升到當前作用域的頂部,實際執行時的代碼類似于:

var y; // 變量提升到作用域頂部
console.log(y); // 輸出 undefined(變量提升,但未賦值)
y = 20; // 賦值操作保留在原地

所以,console.log(y) 不會報錯,而是輸出 undefined,因為此時 y 已經被聲明,但還未被賦值。

②函數提升

函數聲明同樣會被提升到作用域頂部,并且可以在聲明之前調用。示例如下:

sayHello(); // 可以正常調用,因為函數聲明被提升到作用域頂部function sayHello() {console.log('Hello!');
}

在上述代碼中,sayHello 函數的聲明被提升到了作用域頂部,所以可以在聲明之前調用它。

③塊級作用域與變量提升

在 ES6 引入 let 和 const 之前,JavaScript 只有全局作用域和函數作用域。let 和 const 引入了塊級作用域,并且它們不會進行變量提升。示例如下:

console.log(z); // 報錯:ReferenceError: z is not defined
let z = 30;

在上述代碼中,let 聲明的變量 z 不會被提升到作用域頂部,在聲明之前訪問 z 會拋出 ReferenceError。

總結來說,“作用域頂部” 就是當前作用域開始的位置,變量和函數的聲明會被提升到這里,而賦值操作不會被提升。

3.重復聲明

var允許在同一作用域內重復聲明變量:

var z = 30;
var z = 40; // 合法,z 的值更新為 40
console.log(z); // 輸出 40

三、let:塊級作用域的革新

1.塊級作用域

let是 ES6 引入的新關鍵字,具有塊級作用域,變量僅在聲明它的代碼塊({ })內有效:

{let a = 5;
}
try {console.log(a); // 報錯:a is not defined
} catch (error) {console.error(error.message);
}

2.暫時性死區

let聲明的變量不存在變量提升,并且在聲明前的區域形成暫時性死區,訪問該變量會報錯:

try {console.log(b); // 報錯:Cannot access 'b' before initialization
} catch (error) {console.error(error.message);
}
let b = 10;

⑴.什么是暫時性死區

暫時性死區(Temporal Dead Zone,TDZ)是 ES6 引入 let 和 const 聲明變量后出現的一個概念,它描述了從代碼塊開始到變量聲明語句之間的區域,在這個區域內訪問使用 let 或 const 聲明的變量會導致 ReferenceError(引用錯誤)。下面詳細解釋:

①與 var 對比理解

在 ES6 之前,JavaScript 中使用 var 聲明變量,存在變量提升現象,即變量聲明會被提升到當前作用域的頂部,在變量聲明前訪問該變量,值為 undefined。例如:

console.log(x); // 輸出 undefined
var x = 10;

而使用 let 和 const 聲明變量時,雖然聲明也會被提升到作用域頂部,但在聲明語句之前存在一個 “死區”,在這個區域內訪問變量會報錯。

②暫時性死區示例

以下代碼展示了 let 和 const 聲明變量時的暫時性死區:

// 這里處于暫時性死區內
console.log(y); // 報錯:ReferenceError: Cannot access 'y' before initialization
let y = 20;// 這里處于暫時性死區內
console.log(z); // 報錯:ReferenceError: Cannot access 'z' before initialization
const z = 30;

在上述代碼中,在 let y = 20; 和 const z = 30; 聲明語句之前的區域就是變量 y 和 z 的暫時性死區,嘗試訪問它們會拋出 ReferenceError。

③塊級作用域中的暫時性死區

let 和 const 具有塊級作用域,暫時性死區也存在于塊級作用域內。示例如下:

if (true) {// 這里處于暫時性死區內console.log(a); // 報錯:ReferenceError: Cannot access 'a' before initializationlet a = 40;
}

在這個 if 代碼塊中,從塊開始到 let a = 40; 聲明語句之間的區域就是變量 a 的暫時性死區。

④暫時性死區的作用

暫時性死區的存在主要是為了讓開發者更清晰地認識變量的生命周期,避免在變量聲明之前意外使用變量,從而減少潛在的錯誤,使代碼更加安全和易于理解。

3.禁止重復聲明

同一作用域內使用let重復聲明變量會報錯:

let c = 20;
try {let c = 30; // 報錯:Identifier 'c' has already been declared
} catch (error) {console.error(error.message);
}

4.在 for 循環中的特殊表現

let聲明的循環變量會為每個迭代創建獨立的綁定,這在處理異步回調時非常有用:

for (let i = 0; i < 3; i++) {setTimeout(() => {console.log(i); // 依次輸出0, 1, 2}, 0);
}

四、const:常量聲明的首選

1.常量聲明

const用于聲明常量,變量必須在聲明時初始化,且后續不能重新賦值:

const PI = 3.14;
try {PI = 3.1415; // 報錯:Assignment to constant variable.
} catch (error) {console.error(error.message);
}

在這個代碼中,嘗試對使用 const 聲明的常量 PI 重新賦值,會拋出錯誤。

2.塊級作用域

let一樣,const具有塊級作用域:

{const d = 100;
}
console.log(d); // 報錯:d is not defined

3.引用類型的特殊性

const聲明的對象或數組,雖然不能重新賦值,但可以修改其屬性或元素:

const obj = { name: 'Alice' };
obj.name = 'Bob'; // 合法,對象屬性被修改
obj = {}; // 報錯:不能重新賦值

五、三者核心區別對比

特性varletconst
作用域函數作用域塊級作用域塊級作用域
變量提升無(暫時性死區)無(暫時性死區)
初始化要求可選可選必須初始化
重新賦值允許允許不允許(基本類型 / 引用類型指針)
重復聲明允許不允許不允許

六、最佳實踐

1.優先使用 const

  • 聲明不會被重新賦值的變量(如配置項、常量、對象引用)時使用const,提高代碼可讀性和安全性
  • 對于對象 / 數組等引用類型,const能防止誤操作導致的引用改變,同時允許修改內部屬性

2.使用 let 替代 var

  • 在需要塊級作用域的場景(如循環、條件判斷)中使用let,避免變量污染
  • 避免變量提升帶來的意外行為,使變量作用域更清晰

3.謹慎使用 var

  • 僅在兼容舊代碼或需要函數作用域的特殊場景使用var
  • 新項目中建議完全使用letconst

七、常見誤區解析

1. const 與不可變性

  • 誤區:認為const聲明的對象 / 數組完全不可變
  • 真相:const保證的是變量引用不變,而非數據內容不變。可以修改對象屬性或數組元素:
const arr = [1, 2, 3];
arr.push(4); // 合法,數組內容改變但引用未變

2.暫時性死區的作用

  • 避免在塊級作用域內重復聲明變量
  • 強制開發者在使用變量前聲明,減少作用域混亂問題

八、總結

ES6 引入的letconst徹底改變了 JavaScript 的變量聲明方式,塊級作用域和常量聲明讓代碼更加健壯和可維護。開發者應遵循 "優先使用 const,必要時使用 let,盡量避免 var" 的原則,充分利用 ES6 的新特性提升代碼質量。理解三種聲明方式的核心差異,能幫助我們寫出更規范、更少錯誤的 JavaScript 代碼,適應現代前端開發的最佳實踐。

隨著 ES6 及后續版本的普及,掌握這些基礎但重要的語法特性,是進階 JavaScript 高級開發的必經之路。合理使用letvarconst,讓我們的代碼在可讀性、安全性和性能上都更上一層樓。

以上博客全面解析了 ES6 中 let、var、const 的特性與區別。你對內容結構、示例講解或最佳實踐部分有什么看法,或者還有其他想補充的知識點,都可以告訴我。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900949.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java基礎 - 反射(2)

文章目錄 示例5. 通過反射獲得類的private、 protected、 默認訪問修飾符的屬性值。6. 通過反射獲得類的private方法。7. 通過反射實現一個工具BeanUtils&#xff0c; 可以將一個對象屬性相同的值賦值給另一個對象 接上篇&#xff1a; 示例 5. 通過反射獲得類的private、 pro…

FCOS目標檢測

一、模型框架 FCOS采用的網絡架構和RetinaNet一樣&#xff0c;都是采用FPN架構&#xff0c;如圖2所示&#xff0c;每個特征圖后是檢測器&#xff0c;檢測器包含3個分支&#xff1a;classification&#xff0c;regression和center-ness。 對于特征圖Fi∈RHWC&#xff0c;其相對…

Java基礎 - 泛型(常見用法)

文章目錄 泛型類泛型方法泛型類派生子類示例 1&#xff1a;子類固定父類泛型類型&#xff08;StringBox 繼承自 Box<String>&#xff09;示例 2&#xff1a;子類保留父類泛型類型&#xff08;AdvancedBox<T> 繼承自 Box<T>)示例 3&#xff1a;添加子類自己的…

YOLO學習筆記 | YOLOv8環境搭建全流程指南(2025.4)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== YOLOv8環境搭建 一、環境準備與工具配置1. Conda虛擬環境搭建2. CUDA與…

【 Beautiful Soup (bs4) 詳解】

引言 Beautiful Soup 是 Python 最流行的 HTML/XML 解析庫&#xff0c;能夠從復雜的網頁文檔中高效提取數據。以下是其核心知識點及示例代碼。 一、庫簡介 1. 核心模塊 BeautifulSoup&#xff1a;主類&#xff0c;用于構建文檔樹結構Tag&#xff1a;表示 HTML/XML 標簽的對象…

傅利葉發布首款開源人形機器人N1:開發者可實現完整復刻

2025年4月11日&#xff0c;上海——通用機器人公司傅利葉正式發布首款開源人形機器人 Fourier N1&#xff0c;并同步開放涵蓋物料清單、設計圖紙、裝配指南、基礎操作軟件在內的完整本體資源包。作為傅利葉 “Nexus 開源生態矩陣” 的首個落地項目&#xff08;“N1” 即 “Nexu…

視覺目標檢測大模型GAIA

中國科學院自動化研究所智能感知與計算研究中心攜手華為等領軍企業&#xff0c;共同推出面向產業應用的視覺目標檢測全流程解決方案——GAIA智能檢測平臺。該研究成果已獲CVPR 2021會議收錄&#xff08;論文鏈接&#xff1a; 論文地址&#xff1a;https://arxiv.org/pdf/2106.…

前端時間同步利器:React + useEffect 實現高性能動態時鐘

前言 在你奮筆疾敲代碼的瞬間&#xff0c;是不是突然一低頭&#xff0c;發現時間像偷偷跑路的變量&#xff0c;一眨眼就從上午飄到下午&#xff1f;飯沒吃、會沒開、工位也快被前端貓霸占了。仿佛你寫的不是代碼&#xff0c;而是“時間穿梭機”。別慌&#xff0c;咱們今天就來…

前端動畫性能優化

前端動畫性能優化全攻略&#xff1a;告別卡頓與高CPU占用 一、動畫性能問題現狀分析 1.1 性能問題現象 動畫幀率低于60FPS時出現明顯卡頓滾動/縮放操作時響應延遲CPU占用率長期超過70%移動端設備發熱嚴重 1.2 核心問題根源 瀏覽器渲染流程中的性能瓶頸主要出現在&#xff1…

springboot中如何處理跨域

什么是跨域 跨域&#xff08;Cross-Origin&#xff09;是瀏覽器出于安全考慮&#xff0c;對不同源的資源訪問施加的限制機制。其核心原因是同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;即瀏覽器僅允許協議&#xff08;Protocol&#xff09;、域名&#xf…

js實現生肖宜忌展示

實現效果圖如下 實現邏輯&#xff1a; 1.錄入屬相列表&#xff08;列表順序不可調整&#xff09;&#xff1b; 2.錄入各屬相相宜、相忌屬相&#xff1b; 3.輸入年份后&#xff0c;根據屬相列表獲取到正確的屬相&#xff1b; 4.根據獲取的屬相去展示宜、忌屬相&#xff1b; 5.打…

3DMAX筆記-UV知識點和烘焙步驟

1. 在展UV時&#xff0c;如何點擊模型&#xff0c;就能選中所有這個模型的uv 2. 分多張UV時&#xff0c;不同的UV的可以設置為不同的顏色&#xff0c;然后可以通過顏色進行篩選。 3. 烘焙步驟 擺放完UV后&#xff0c;要另存為一份文件&#xff0c;留作備份 將模型部件全部分成…

AI 重構 Java 遺留系統:從靜態方法到 Spring Bean 注入的自動化升級

在當今快速發展的軟件行業中&#xff0c;許多企業都面臨著 Java 遺留系統的維護和升級難題。這些老舊系統往往采用了大量靜態方法&#xff0c;隨著業務的不斷發展&#xff0c;其局限性日益凸顯。而飛算 JavaAI 作為一款強大的 AI 工具&#xff0c;為 Java 遺留系統的重構提供了…

【從一個 TypeScript 報錯理解 ES6 模塊的三種導入方式】

從一個 TypeScript 報錯理解 ES6 模塊的三種導入方式 在日常開發中&#xff0c;我們經常遇到模塊導入導出的場景。最近在處理一個項目時&#xff0c;遇到了一個有趣的問題&#xff1a;對于只有默認導出的模塊&#xff0c;我們該使用哪種導入方式&#xff1f;這個問題引發了對 …

安徽京準:NTP網絡時鐘服務器功能及同步模式的介紹

安徽京準&#xff1a;NTP網絡時鐘服務器功能及同步模式的介紹 安徽京準&#xff1a;NTP網絡時鐘服務器功能及同步模式的介紹 1、NTP網絡時鐘服務器概念&#xff1a; NTP時鐘服務器&#xff0c;表面意思是時間計量工具的服務設備&#xff0c;其在現代工業中是用于對客戶端設備…

JMeter從入門到荒廢-常見問題匯總

啟動某個ThreadGroup的時候&#xff0c;啟動不了 現象 點擊start按鈕的時候&#xff0c;結果樹和匯總報告都沒有任何數據。 同時&#xff0c;點擊右上角的error log 發現有錯誤信息&#xff1a; 錯誤信息如下&#xff1a; 2025-04-09 10:03:48,009 ERROR o.a.j.g.a.ActionR…

Elasticsearch 學習規劃

Elasticsearch 學習規劃 明確學習目標與動機 場景化需求分析 - **S**&#xff1a;掌握Elasticsearch架構體系&#xff0c;熟練使用Elasticsearch 進行數據分析,Elasticsearch結合java 項目落地案例 - **M**&#xff1a;搜索和Elasticsearch相關GitHub項目 - **A**&#xff1a;每…

核心案例 | 湖南汽車工程職業大學無人機操控與編隊技術實驗室

核心案例 | 湖南汽車工程職業大學無人機操控與編隊技術實驗室 為滿足當今無人機行業應用需求&#xff0c;推動無人機技術的教育與實踐深度融合&#xff0c;北京卓翼智能科技有限公司旗下品牌飛思實驗室與湖南汽車工程職業大學強強聯手&#xff0c;共同建設無人機操控與編隊技術…

【Android】Android 獲取當前前臺應用包名與自動化控制全流程實踐筆記(適配 Android 10+)

一、前言 在 Android 系統中&#xff0c;獲取當前運行的前臺應用、返回桌面、跳轉權限設置、關閉其他應用等行為&#xff0c;往往受到系統的嚴格限制。隨著 Android 版本的提升&#xff08;特別是 Android 10 之后&#xff0c;即 API 29&#xff09;&#xff0c;很多傳統方法已…

Sentinel核心源碼分析(上)

文章目錄 前言一、客戶端與Spring Boot整合二、SphU.entry2.1、構建責任鏈2.2、調用責任鏈2.2.1、NodeSelectorSlot2.2.2、ClusterBuilderSlot2.2.3、LogSlot2.2.4、StatisticSlot2.2.5、AuthoritySlot2.2.6、SystemSlot2.2.7、FlowSlot2.2.7.1、selectNodeByRequesterAndStrat…