【JS-6-ES6中的let和const】深入理解ES6中的let和const:塊級作用域與變量聲明的新范式

在ES6(ECMAScript 2015)之前,JavaScript中只有var一種變量聲明方式,這導致了許多作用域相關的問題。ES6引入了letconst兩種新的變量聲明方式,徹底改變了JavaScript的作用域規則。本文將深入探討letconst的特性、優勢以及它們與var的區別。

1. var的問題與ES6的解決方案

1.1 var的局限性

在ES5及之前版本中,var聲明存在幾個主要問題:

  1. 函數作用域var聲明的變量只有函數作用域,沒有塊級作用域
  2. 變量提升:變量可以在聲明前使用,值為undefined
  3. 可重復聲明:同一作用域內可以重復聲明同名變量
  4. 全局污染:在全局作用域聲明的變量會自動成為window對象的屬性

1.2 ES6的解決方案

ES6通過letconst引入了:

  • 塊級作用域:變量只在聲明所在的代碼塊內有效
  • 暫時性死區:變量在聲明前不可訪問
  • 禁止重復聲明:同一作用域內不能重復聲明同名變量
  • 更合理的全局行為:全局作用域聲明的變量不會自動成為全局對象的屬性

2. let聲明

2.1 基本用法

let聲明的變量具有塊級作用域:

{let a = 10;var b = 1;
}console.log(a); // ReferenceError: a is not defined
console.log(b); // 1

2.2 特點詳解

  1. 塊級作用域

    • let聲明的變量只在它所在的代碼塊內有效
    • 適用于ifforwhile等任何代碼塊
  2. 不存在變量提升

    console.log(foo); // undefined
    console.log(bar); // ReferenceErrorvar foo = 2;
    let bar = 2;
    
  3. 暫時性死區(TDZ)

    • 在代碼塊內,使用let聲明變量前,該變量不可用
    • 這確保了變量必須先聲明后使用
  4. 不允許重復聲明

    let a = 1;
    let a = 2; // SyntaxError
    

2.3 經典應用:循環計數器

let解決了var在循環中的常見問題:

// var的問題
for (var i = 0; i < 3; i++) {setTimeout(() => console.log(i), 0); // 輸出3次3
}// let的解決方案
for (let i = 0; i < 3; i++) {setTimeout(() => console.log(i), 0); // 輸出0,1,2
}

這是因為let為每次循環創建了一個新的塊級作用域。

3. const聲明

3.1 基本用法

const用于聲明常量,一旦聲明,值不能改變:

const PI = 3.1415;
PI = 3; // TypeError: Assignment to constant variable

3.2 特點詳解

  1. 必須初始化

    const FOO; // SyntaxError: Missing initializer in const declaration
    
  2. 塊級作用域:與let相同

  3. 暫時性死區:與let相同

  4. 不允許重復聲明:與let相同

  5. 本質是變量指向的內存地址不變

    • 對于基本類型數據(數值、字符串、布爾值),值就保存在變量指向的內存地址
    • 對于復合類型數據(對象、數組),變量指向的內存地址保存的只是一個指針

3.3 const與對象

const只能保證變量名指向的地址不變,不保證該地址的數據不變:

const obj = {};
obj.prop = 123; // 可以
obj = {}; // TypeErrorconst arr = [];
arr.push('Hello'); // 可以
arr = ['Dave']; // TypeError

如果需要完全不可變的對象,可以使用Object.freeze()

const obj = Object.freeze({});
obj.prop = 123; // 靜默失敗或TypeError(嚴格模式)

4. let、const與var的對比

特性varletconst
作用域函數塊級塊級
變量提升
暫時性死區
重復聲明允許不允許不允許
全局屬性
必須初始化
值可變僅對象內容可變

5. 最佳實踐

  1. 默認使用const

    • 除非明確知道變量需要重新賦值,否則優先使用const
    • 這可以使代碼更可預測,減少意外的變量修改
  2. 需要重新賦值時使用let

    • 如循環計數器、需要重新賦值的變量等
  3. 避免使用var

    • 除非需要支持非常舊的瀏覽器環境
    • 現代JavaScript開發中幾乎沒有使用var的必要
  4. 對象凍結

    • 如果確實需要完全不可變的對象,結合Object.freeze()使用

6. 兼容性與轉譯

對于需要支持舊瀏覽器的項目,可以使用Babel等工具將ES6代碼轉譯為ES5代碼。現代瀏覽器和Node.js環境已普遍支持letconst

7. 結論

ES6的letconst為JavaScript帶來了更合理的變量聲明方式,解決了var帶來的諸多問題。通過理解它們的特點和適用場景,開發者可以編寫出更安全、更易維護的代碼。在實踐中,建議優先使用const,必要時使用let,而避免使用var,這已成為現代JavaScript開發的共識。

掌握letconst是深入理解現代JavaScript的重要一步,它們不僅僅是新的語法糖,更是JavaScript語言設計理念進步的重要體現。

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

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

相關文章

[C語言]數據類型關鍵字詳解

基本數據類型 關鍵字說明存儲大小(通常)取值范圍(通常)示例int聲明整型變量4字節(32位系統)-2,147,483,648 到 2,147,483,647int count 100;char聲明字符型變量1字節-128 到 127 或 0 到 255char grade ‘A’;float聲明單精度浮點數4字節1.2e-38 到 3.4e38 (約6-7位有效數字…

黑馬python(二十二)

目錄&#xff1a; 1.Python操作Mysql基礎使用 2.Python操作Mysql數據插入 3.綜合案例 1.Python操作Mysql基礎使用 2.Python操作Mysql數據插入 3.綜合案例 代碼復用 黑馬python&#xff08;二十一&#xff09;章節的的代碼&#xff0c;讀取文件內容

課堂筆記:吳恩達的AI課(AI FOR EVERYONE)-W1 深度學習的非技術性解釋

深度學習的非技術性解釋 &#xff08;1&#xff09;示例1&#xff1a;以商場為主買T恤為例&#xff0c;價格和需求的關系怎么樣&#xff1f; 一般來說&#xff0c;價格越高&#xff0c;需求越少 這里輸入A是 價格&#xff0c;輸出B是需求&#xff0c;其中的映射關系是神經元&a…

dlib檢測視頻中的人臉并裁剪為圖片保存

環境要求 找個帶有基本cv配置的虛擬環境安裝上dlib依賴的人臉檢測的基礎環境即可&#xff0c;主要是&#xff1a; pip install boost dlib opencv-python缺的按提示安裝。 demo 設置好視頻路徑和圖像保存路徑&#xff0c;裁剪尺寸&#xff08;默認256&#xff09;以及裁剪幀…

真的!ToDesk遠程控制已上線原生鴻蒙系統!

2025年5月&#xff0c;ToDesk遠程控制正式宣布完成對PC鴻蒙系統的適配&#xff0c;成為業界首批原生支持HarmonyOS OS的跨端遠控工具。 作為國內支持上億設備的遠程控制軟件&#xff0c;ToDesk以無縫互聯、快速響應、安全無界為核心&#xff0c;重新定義了跨設備遠程協作的界限…

Java-58 深入淺出 分布式服務 ACID 三階段提交3PC 對比2PC

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; 目前2025年06月16日更新到&#xff1a; AI煉丹日志-29 - 字節…

matplotlib 繪制餅圖

1、功能介紹&#xff1a; 使用 python 的 matplotlib 庫來創建一個簡單的餅圖。 2、代碼部分&#xff1a; import matplotlib.pyplot as plt# 示例數據 labels [A, B, C, D, E] # 類別標簽 sizes [15, 30, 45, 5, 5] # 每個類別對應的數值&#xff08;百分比&#xff09…

用Rust寫平衡三進制除法器

1、除法的本質 除法的本質是減法&#xff0c;也就是一個大的數減去一個小的數&#xff0c;比如:10/2&#xff0c;也就是10-2-2-2-2-20&#xff0c;所以商5余0&#xff0c;10/3&#xff0c;也就是10-3-3-31&#xff0c;所以商3余1&#xff0c;這也是很常見的方法&#xff0c;但如…

深入探索WordPress Multisite:構建與管理多站點網絡

隨著互聯網的快速發展&#xff0c;越來越多的企業和個人開始使用內容管理系統來搭建和維護自己的網站。WordPress作為全球最受歡迎的CMS之一&#xff0c;因其強大的功能和靈活性&#xff0c;成為了許多網站管理員的首選平臺。而在一些特定需求的場景下&#xff0c;WordPress Mu…

.Net Core 獲取文件路徑

在 .NET Core 中獲取文件路徑的方法取決于你要獲取的文件的位置和上下文。這里將介紹幾種常見的方式來獲取文件路徑。 1. 獲取當前工作目錄 你可以使用 Directory.GetCurrentDirectory() 方法來獲取當前工作目錄的路徑&#xff1a; using System; using System.IO; class P…

順序表整理和單項鏈表01 day20

二&#xff1a;各個主要函數 一&#xff1a;CreatSeqList SeqList *CreateSeqList(int len); -------------------------------------------------------------/*** brief Create a Seq List object 創建一個順序表** param n 是順序表的大小* return SeqList* 指向順序表的…

電商導購app平臺的緩存策略與性能優化方案:架構師的實踐經驗

電商導購app平臺的緩存策略與性能優化方案&#xff1a;架構師的實踐經驗 大家好&#xff0c;我是阿可&#xff0c;微賺淘客系統及省賺客APP創始人&#xff0c;是個冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 緩存策略的重要性 在電商導購APP平臺中&#xff…

學習C++、QT---12(C++的繼承、權限對繼承的影響)

每日一言 你的價值&#xff0c;由你自己定義&#xff0c;無需他人評判。 C的繼承 直接上案例 繼承是什么意思呢&#xff0c;就是我本來這個類我叫他基類、我希望創建我的下一個類有我這之前的類的屬性和方法&#xff0c;那么我如果不用繼承的話&#xff0c;就需要多寫很多一樣…

(6)Wireshark的TCP包詳解-上篇

1.簡介 上一篇中通過介紹和講解&#xff0c;應該知道要講解和介紹的內容在哪里了吧&#xff0c;沒錯就是介紹OSI七層模型的傳輸層。因為只有它建立主機端到端的連接如&#xff1a;TCP、UDP。 2.TCP是什么? tcp是工作在傳輸層&#xff0c;也就是網絡層上一層的協議。 它是面…

太極八卦羅盤JS繪制

LeaferJS 是一款好用的 Canvas 引擎,通過LeaferJS繪制羅盤案例. https://www.leaferjs.com/ui/guide/ 示例 太極八卦羅盤 直接上代碼 <template><div id"LuoPan"></div><div id"info"><p>屏幕寬度: {{ screenWidth }}px<…

Python開源項目月排行 2025年5月

#2025年5月2025年6月1日1scrapy一個開源的、基于 Python 的高性能網絡爬蟲和數據抓取框架。Scrapy 項目最初由倫敦的網絡聚合和電子商務公司 Mydeco 的員工以及烏拉圭蒙得維的亞的網絡咨詢公司 Insophia 的開發者共同創建。目前&#xff0c;Scrapy 由 Zyte&#xff08;原名 Scr…

Debezium日常分享系列之:在 Kubernetes 中使用 Debezium 的 CDC

Debezium日常分享系列之&#xff1a;在 Kubernetes 中使用 Debezium 的 CDC 架構源數據庫創建數據庫憑證密鑰Debezium 自定義鏡像構建并推送鏡像Kafka Connect 集群Debezium Postgres 連接器Debezium 創建的 Kafka 主題 Debezium 是一個開源的分布式變更數據捕獲 (CDC) 平臺。D…

tf serving和torch serve哪個耗時更低

TensorFlow Serving&#xff08;TF Serving&#xff09;和 TorchServe 的耗時對比需結合具體場景&#xff08;如硬件配置、模型類型、優化策略等&#xff09;&#xff0c;以下從多維度分析兩者的性能差異及適用場景。 ?? 1. 標準性能基準對比 根據公開壓測數據&#xff08;…

Java面試寶典:基礎六

133. 二進制小數點位移 答案:C(乘以2) 解析: 原理:二進制小數點右移一位等價于乘以 (2^1)(左移則除以 (2))。示例: 101.1(5.5)右移 → 1011(11)驗證:(5.5 \times 2 = 11)說明:位移前:1 0 1 . 1 (值 = 2+2?+2? = 5.5) 位移后:1 0 1 1 . (值 = 2+2+2? =…

04-React中綁定this并給函數傳參的幾種方式

前言綁定 this 的方式一&#xff1a;bind()綁定 this 并給函數傳參 的方式二&#xff1a;構造函數里設置 bind()綁定 this 并給函數傳參 的方式三&#xff1a;箭頭函數【薦】 前言 我們先來看下面這段代碼&#xff1a; components/MyComponent.jsx import React from "…