深入理解 let、var 和 const

JavaScript 中的變量聲明有三種主要方式:varlet?和?const。理解它們之間的差異對于編寫清晰、有效的代碼至關重要。本文將深入探討這三種聲明方式的區別、使用場景以及潛在的陷阱。

一、var?關鍵字

1.1 特點

  1. 函數作用域var?聲明的變量在函數內是局部變量,在函數外是全局變量。
  2. 變量提升var?聲明的變量會被提升到其作用域的頂部,但不會初始化。

1.2 示例

console.log(a); // undefined
var a = 10;
console.log(a); // 10function testVar() {var b = 20;if (true) {var b = 30; // 同一作用域內變量重定義console.log(b); // 30}console.log(b); // 30
}testVar();
?

在上述示例中,a?的聲明被提升到了腳本的頂部,但其初始化仍在原來的位置。b?在函數?testVar?內被重新聲明并賦值,兩個?b?變量實際指向同一個變量。

二、let?關鍵字

2.1 特點

  1. 塊作用域let?聲明的變量在其所在的塊級作用域內有效。
  2. 無變量提升let?聲明的變量不會被提升,必須在聲明后才能使用。
  3. 暫時性死區:在塊級作用域內,let?聲明的變量在聲明之前不可用。

2.2 示例

if (true) {console.log(c); // ReferenceError: c is not definedlet c = 10;console.log(c); // 10
}function testLet() {let d = 20;if (true) {let d = 30; // 塊級作用域內變量重定義console.log(d); // 30}console.log(d); // 20
}testLet();
?

在這個示例中,c?在聲明之前不可用,導致了引用錯誤。d?在?if?塊內和塊外是兩個不同的變量。

三、const?關鍵字

3.1 特點

  1. 塊作用域const?聲明的變量在其所在的塊級作用域內有效。
  2. 不可重新賦值const?聲明的變量一旦賦值后不能再更改。
  3. 無變量提升:與?let?類似,const?聲明的變量不會被提升。
  4. 暫時性死區const?聲明的變量在聲明之前不可用。

3.2 示例

if (true) {const e = 10;console.log(e); // 10// e = 20; // TypeError: Assignment to constant variable.
}const f = { value: 30 };
f.value = 40; // 允許修改對象屬性
console.log(f.value); // 40// f = { value: 50 }; // TypeError: Assignment to constant variable.
?

在這個示例中,e?的值不能被重新賦值。f?是一個對象,盡管對象的屬性可以被修改,但?f?不能被重新賦值為另一個對象。

四、對比與選擇

4.1 作用域

  • var:函數作用域或全局作用域。
  • let?和?const:塊級作用域。

4.2 變量提升

  • var:聲明提升,但不會初始化。
  • let?和?const:沒有變量提升,存在暫時性死區。

4.3 重新賦值

  • var?和?let:可以重新賦值。
  • const:不可重新賦值,但對象的屬性可變。

4.4 使用建議

  • 優先使用?const?聲明變量,確保變量不會被意外重新賦值。
  • 需要重新賦值的變量使用?let
  • 避免使用?var,除非有特殊需求,因其作用域和提升行為可能導致難以調試的問題。

五、實際應用場景

5.1 使用?let?和?const?替代?var

在現代JavaScript代碼中,let?和?const?的使用逐漸取代了?var。以下是一個重構示例:

// 舊代碼使用 var
function exampleVar() {var name = 'Alice';var age = 25;console.log(name, age);
}// 新代碼使用 let 和 const
function exampleLetConst() {const name = 'Alice';let age = 25;console.log(name, age);
}
?

5.2 塊級作用域中的使用

在循環中使用?let?避免全局變量污染:

for (let i = 0; i < 5; i++) {setTimeout(() => console.log(i), 1000);
}
?

在這個示例中,let?保證了每次循環的?i?都是獨立的,而不是共享一個全局變量。

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

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

相關文章

RT thread 在gd32f303平臺下rtc bug date獲取時間錯誤始終是1970

現象 時間設置指令 date 2025 6 18 10 28 00 時間獲取指令 date date指定顯示設置OK,但是返回的時間始終是Thu Jan 1 08:00:00 1970 msh >date local time: Thu Jan 1 08:00:00 1970 timestamps: 0 timezone: UTC+

jieba中lcut與cut的區別及用法

jieba 庫中的 cut 和 lcut 是中文分詞的核心函數&#xff0c;兩者的核心區別在于??返回類型??和??適用場景??&#xff0c;具體對比如下&#xff1a; ?? 1. ??核心區別?? ??函數????返回類型????特點????等價操作??jieba.cut生成器&#xff08;G…

LoRA、QLoRA是什么

一&#xff1a; LoRA&#xff08;Low-Rank Adaptation&#xff0c;低秩適應&#xff09;是一種高效的大模型參數微調技術&#xff0c;由Meta在2021年提出。它通過凍結預訓練模型參數&#xff0c;僅訓練少量新增的低秩矩陣&#xff0c;大幅減少了需要訓練的參數量&#xff0c;同…

【web應用】在 Vue 3 中實現餅圖:使用 Chart.js實現餅圖顯示數據分析結果

文章目錄 前言一、準備工作二、實現餅圖組件三、關鍵點解析四、實現效果總結 前言 在現代 Web 應用中&#xff0c;數據可視化是不可或缺的一部分。無論是展示統計信息還是監控關鍵指標&#xff0c;圖表都能幫助用戶更直觀地理解數據。在 Vue 3 項目中&#xff0c;我們可以使用…

分頁數據不準問題分析與解決

大綱 &#x1f4d6; 1、場景 &#x1fab5;2、原因 &#x1f525;3、解決方式&#xff1a;游標分頁 &#x1f4cf;4、一點思考&#x1f4a1;5、全表查詢的優化思路 &#x1f345; 記錄一個分頁不準的問題 1、場景 &#x1fab5; 調用一個第三方List接口&#xff08;帶分頁&am…

MyBatis原理剖析(三)--加載配置文件

下面我們正式進入mybatis的源碼學習&#xff0c;之前我們已經了解過mybatis中通過配置文件來保證與數據庫的交互。配置文件分為核心配置文件和映射配置文件&#xff0c;核心配置文件的主要作用就是加載數據庫的一些配置信息而映射配置文件則是執行對應的sql語句。同時核心配置文…

C++(運算符重載)

一.友元 C中使用關鍵字friend可以在類外訪問所有的成員&#xff0c;包括私有成員&#xff08;之前提到過封裝的核心思想是隱藏內部實現細節&#xff0c;通過公共接口控制訪問&#xff09;&#xff0c;所以友元可以突破封裝的限制訪問數據&#xff0c;盲目使用會導致程序穩定性…

XR-RokidAR-UXR3.0-Draggable 腳本解析

using System.Collections.Generic; using Rokid.UXR.Utility; using UnityEngine; using UnityEngine.EventSystems;namespace Rokid.UXR.Interaction {/// <summary>/// Draggable 拖拽組件/// </summary>// [RequireComponent(typeof(RayInteractable))]public …

GitHub 趨勢日報 (2025年06月17日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 1022 anthropic-cookbook 986 awesome-llm-apps 910 fluentui-system-icons 754 r…

NodeJS的中間件是什么

說簡單一點&#xff0c;中間件就是在你的請求和業務邏輯之間做一層攔截。 在 Node.js 中&#xff0c;中間件&#xff08;Middleware&#xff09; 是一種函數&#xff0c;它在 請求&#xff08;Request&#xff09;到達路由處理器之前&#xff0c;或在 響應&#xff08;Respons…

MCAL學習(6)——診斷、DCM

1.診斷概述 汽車診斷就是通過汽車總線&#xff08;CAN LIN Eth&#xff09;來進行診斷會話&#xff0c;大部分通過CAN總線通訊進行請求與響應。 1.診斷分層 DCM內部支持UDS服務和OBD服務&#xff08;排放&#xff0c;動力&#xff09;。 以統一診斷服務UDS為例&#xff0c;應…

kafka-生產者-(day-4)

day-3 BufferPool 產生原因&#xff1a;ByteBuffer的創建和釋放都是比較耗費資源的&#xff0c;為了實現內存的高效利用&#xff0c;產生了他。他會對特定大小的ByteBuffer進行管理 BufferPool的字段 free:是一個ArrayDeque隊列&#xff0c;緩存指定大小的ByteBuffer對象Re…

java 驗證ip是否可達

默認IP的設備已開放ping功能 代碼 public class PingTest {public static void main(String[] args) throws Exception {String ip "192.168.21.101";boolean reachable InetAddress.getByName(ip).isReachable(3000);System.out.println(ip (reachable ? &quo…

LeetCode 2187.完成旅途的最少時間

題目&#xff1a; 給你一個數組 time &#xff0c;其中 time[i] 表示第 i 輛公交車完成 一趟旅途 所需要花費的時間。 每輛公交車可以 連續 完成多趟旅途&#xff0c;也就是說&#xff0c;一輛公交車當前旅途完成后&#xff0c;可以 立馬開始 下一趟旅途。每輛公交車 獨立 運…

永磁同步電機無速度算法--基于正切函數鎖相環的滑模觀測器

最近在學習鎖相環&#xff0c;后續會記錄一下了解到的幾種PLL。 一、原理介紹 傳統鎖相環控制框圖如下所示 在電機正轉時&#xff0c;傳統鎖相環可以實現很好的轉速和轉子位置估計&#xff0c;但是當電機反轉&#xff0c;反電動勢符號發生變化&#xff0c;系統估計轉子位置最…

Vim-vimrc 快捷鍵映射

Vim-vimrc 快捷鍵映射 文章目錄 Vim-vimrc 快捷鍵映射Leader 鍵快捷鍵映射&#xff1a;插入特定字符插入 --插入 ##插入 解釋Leader鍵設置快速插入分隔線 Leader 鍵 我們還將 , 設置為 Leader 鍵&#xff0c;使得其他快捷鍵映射更加簡潔。 let mapleader ","快捷鍵…

SylixOS armv7 任務切換

SylixOS 操作系統下&#xff0c;任務切換可以分為兩種 中斷退出時&#xff0c;執行的任務切換&#xff08;_ScheduleInt&#xff09;內核退出時&#xff0c;執行的任務切換&#xff08;_Schedule&#xff09; 下面分別講講這兩種任務切換 1、中斷退出時任務切換 關于 ARM 架…

Java 自定義異常:如何優雅地處理程序中的“業務病”?

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 一、從一個真實場景開始&#xff1a;銀行轉賬系統的困境 假設你正在開發一個銀行轉賬系統&#xff0c;當用戶嘗試轉賬時可能出現以下問題&#xff1a; 轉…

【JAVA】【Stream流】

1. filter操作 filter()方法用于根據給定的條件過濾列表中的元素&#xff0c;僅保留滿足條件的項。 List<Integer> list Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);List<Integer> res list.stream().filter(a -> a % 2 0).collect(Collectors.toList());for(I…

四、Redis實現限流

簡介&#xff1a; 限流算法在分布式領域是一個經常被提起的話題&#xff0c;當系統的處理能力有限時&#xff0c;如何阻止計劃外的請求繼續對系統施壓。 系統要限定用戶的某個行為在指定的時間里只能允許發生 N 次&#xff0c;如何使用 Redis 的數據結構來實現這個限流的功能&a…