為什么要用 const 和 let,而不是 var?

JavaScript 中有三種方式聲明變量:varletconst。其中,var 是早期版本的 JavaScript 中的標準,但隨著 ECMAScript 6(ES6)引入了 letconstvar 的種種問題也顯現出來。今天,我們將探討為什么你應該避免使用 var,而優先選擇 constlet

var 的問題

1. 作用域問題

var 的最大問題之一是作用域是 函數作用域,而不是 塊級作用域。這意味著,在 iffor 這樣的代碼塊內使用 var 聲明的變量,仍然可以在整個函數內訪問。

舉個例子:

function test() {if (true) {var name = 'John';}console.log(name);  // 'John'
}
test();

盡管 name 變量是在 if 語句內部聲明的,但由于 var 的作用域是整個函數,所以 nameif 語句外部也能訪問。

2. 變量提升

var 聲明的變量會被“提升”到函數或全局作用域的頂部,這會導致一些難以察覺的錯誤。

function test() {console.log(age);  // undefined,而不是報錯var age = 26;
}
test();

這里,雖然你期望 age 在聲明前不可訪問,但實際上它被提升到了函數頂部,只是沒有值而已,導致打印的是 undefined

3. 多次聲明不會報錯

你可以在同一作用域內多次使用 var 聲明相同的變量,JavaScript 也不會報錯。

var age = 30;
var age = 40;  // 沒有錯誤
console.log(age);  // 40

這種行為可能會導致不可預測的結果。

letconst 的優勢

1. 塊級作用域

letconst 解決了 var 作用域的問題,它們都使用 塊級作用域。這意味著它們的作用域僅限于它們被聲明的代碼塊。

if (true) {let name = 'Alice';console.log(name);  // 'Alice'
}
console.log(name);  // ReferenceError: name is not defined

在這個例子中,name 僅在 if 語句塊內部可用,外部無法訪問。

2. 避免提升和暫時性死區

letconst 不會像 var 那樣被提升,它們會進入 暫時性死區(TDZ),即在聲明之前訪問會拋出錯誤。

console.log(age);  // ReferenceError: Cannot access 'age' before initialization
let age = 26;

3. 常量值

const 用來聲明常量,一旦賦值就不能修改。這對避免意外修改變量值非常有用。

const age = 30;
age = 40;  // TypeError: Assignment to constant variable.

何時使用 letconst

  • const 優先:如果變量的值不會改變,使用 const。它可以幫助你清晰地表達意圖,同時避免了修改的錯誤。
  • let:只有當你知道變量的值將來會發生變化時,才使用 let

for 循環中的使用

for 循環中,letvar 的行為大不相同。使用 let,每次迭代都會創建一個新的作用域,避免了 var 的問題。

// 使用 var
for (var i = 0; i < 5; ++i) {setTimeout(() => console.log(i), 0);
}
// 輸出 5, 5, 5, 5, 5// 使用 let
for (let i = 0; i < 5; ++i) {setTimeout(() => console.log(i), 0);
}
// 輸出 0, 1, 2, 3, 4

總結

  • 避免使用 varvar 具有不直觀的作用域和提升機制,容易引發錯誤。
  • 優先使用 const:當變量值不會改變時,使用 const,它能清晰表達你的意圖并避免修改錯誤。
  • 使用 let:當變量值需要改變時,使用 let,它提供了塊級作用域。

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

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

相關文章

從零開始玩轉TensorFlow:小明的機器學習故事 2

你好&#xff0c;TensorFlow&#xff01;——從零開始的第一個機器學習程序 1. 為什么要寫這個“Hello, TensorFlow!”&#xff1f; 無論學習什么新語言或新框架&#xff0c;“Hello World!”示例都能幫助我們快速確認開發環境是否就緒&#xff0c;并掌握最基本的使用方式。對…

【Java八股文】10-數據結構與算法面試篇

【Java八股文】10-數據結構與算法面試篇 數據結構與算法面試題數據結構紅黑樹說一下跳表說一下&#xff1f;LRU是什么&#xff1f;如何實現&#xff1f;布隆過濾器怎么設計&#xff1f;時間復雜度&#xff1f; 排序算法排序算法及空間復雜度 數據結構與算法面試題 數據結構 紅…

Docker換源加速(更換鏡像源)詳細教程(2025.2最新可用鏡像,全網最詳細)

文章目錄 前言可用鏡像源匯總換源方法1-臨時換源換源方法2-永久換源&#xff08;推薦&#xff09;常見問題及對應解決方案1.換源后&#xff0c;可以成功pull&#xff0c;但是search會出錯 補充1.如何測試鏡像源是否可用2.Docker內的Linux換源教程 換源速通版&#xff08;可以直…

華為云deepseek大模型平臺:deepseek滿血版

華為云硅基流動使用Chatbox接入DeepSeek-R1滿血版671B 1、注冊&#xff1a; 華為云deepseek大模型平臺注冊&#xff1a;https://cloud.siliconflow.cn/i/aDmz6aVN 說明&#xff1a;填寫邀請碼的話邀請和被邀請的賬號都會獲得2000 萬 Tokens&#xff1b;2個帳號間不會與其他關聯…

抓包工具是什么?

抓包工具是一種用于捕獲和分析網絡數據包的軟件或硬件設備。它可以幫助用戶監控網絡通信過程&#xff0c;查看網絡中傳輸的數據內容、協議類型、源地址、目的地址等信息。以下是關于抓包工具的一些詳細解釋&#xff1a; 1. 主要功能 捕獲數據包&#xff1a;抓包工具能夠實時捕…

51c大模型~合集71

我自己的原文哦~ https://blog.51cto.com/whaosoft/12260659 #大模型推理加速技術的學習路線 EfficientQAT 可以在 41 小時內在單個 A100-80GB GPU 上完成對 2-bit Llama-2-70B 模型的量化感知訓練。與全精度模型相比&#xff0c;精度僅下降了不到 3%&#xff08;69.48 v…

OpenBMC:BmcWeb實例化App

BmcWeb是OpenBMC的一個核心模塊&#xff0c;對外負責響應Redfish請求&#xff0c;并且由于OpenBMC的Web使用的Redfish api&#xff0c;所以BmcWeb也是Web的后臺。 1.main函數 //src\webserver_main.cpp #include "webserver_run.hpp"int main(int /*argc*/, char**…

利用AI優化可再生能源管理:Python讓綠色能源更高效

利用AI優化可再生能源管理&#xff1a;Python讓綠色能源更高效 引言 在全球氣候變化和能源危機的背景下&#xff0c;可再生能源的利用變得尤為重要。然而&#xff0c;可再生能源的管理和優化面臨諸多挑戰&#xff0c;如能源生產的不穩定性和能源需求的波動性。幸運的是&#…

改BUG:Mock測試的時候,when失效

問題再現&#xff1a; 這里我寫了一測試用戶注冊接口的測試類&#xff0c;并通過when模擬下層的服務&#xff0c;但實際上when并沒有奏效&#xff0c;還是走了真實的service層的邏輯。 package cn.ac.evo.review.test;import cn.ac.evo.review.user.UserMainApplication; imp…

單片機 code RO-data RW-data ZI-data以及OTA學習

帶著問題去學習&#xff1a;這些數據是什么&#xff1f;分別放在哪里&#xff0c; 是什么&#xff1a;我個人的理解 code 和RO-data 分別是代碼和只讀數據&#xff0c;RW-data以及ZI-data分別是讀寫數據和初始化數據。 codeRO-data的大小正好是所占用ROM的大小&#xff0c;RO…

什么是LoRA微調

LoRA是大模型微調方法的一種&#xff0c;它的特點是只在模型的 部分權重&#xff08;如 QKV 矩陣&#xff09; 上 添加可訓練參數 通過 低秩矩陣&#xff08;AB&#xff09; 來優化參數更新 優點&#xff1a; 極大降低顯存消耗&#xff08;deepseek 7B 只需 10GB&#xff09; 適…

EasyRTC低延遲通信與智能處理:論嵌入式WebRTC與AI大模型的技術融合

在當今數字化時代&#xff0c;實時通信的需求日益增長&#xff0c;視頻通話作為一種高效、直觀的溝通方式&#xff0c;廣泛應用于各個領域。WebRTC技術的出現&#xff0c;為實現瀏覽器之間的實時音視頻通信提供了便捷的解決方案。而基于WebRTC技術的EasyRTC視頻通話SDK&#xf…

10、k8s對外服務之ingress

service和ingress的作用 service的作用 NodePort&#xff1a;會在每個節點開放一個端口&#xff0c;端口號30000-32767。 也是只能用于內網訪問&#xff0c;四層轉發。實現負載均衡。不能基于域名進行訪問。 clusterip&#xff1a;service的默認類型&#xff0c;只能在集群…

Java數據結構---棧

目錄 一、棧的概念 二、棧的基本方法 三、棧的模擬實現 四、棧的練習 1、括號匹配 2、出棧入棧次序匹配 一、棧的概念 棧是一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂&#xff0c;另一端稱為棧底…

從CNN到Transformer:遙感影像目標檢測的未來趨勢

文章目錄 前言專題一、深度卷積網絡知識專題二、PyTorch應用與實踐&#xff08;遙感圖像場景分類&#xff09;專題三、卷積神經網絡實踐與遙感影像目標檢測專題四、卷積神經網絡的遙感影像目標檢測任務案例【FasterRCNN】專題五、Transformer與遙感影像目標檢測專題六、Transfo…

php-fpm

摘要 php-fpm(fastcgi process manager)是PHP 的FastCGI管理器&#xff0c;管理PHP的FastCGI進程&#xff0c;提升PHP應用的性能和穩定性 php-fpm是一個高性能的php FastCGI管理器&#xff0c;提供了更好的php進程管理方式&#xff0c;可以有效的控制內存和進程&#xff0c;支…

Python strip() 方法詳解:用途、應用場景及示例解析(中英雙語)

Python strip() 方法詳解&#xff1a;用途、應用場景及示例解析 在 Python 處理字符串時&#xff0c;經常會遇到字符串前后存在多余的空格或特殊字符的問題。strip() 方法就是 Python 提供的一個強大工具&#xff0c;專門用于去除字符串兩端的指定字符。本文將詳細介紹 strip(…

open webui 部署 以及解決,首屏加載緩慢,nginx反向代理訪問404,WebSocket后端服務器鏈接失敗等問題

項目地址&#xff1a;GitHub - open-webui/open-webui: User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 選擇了docker部署 如果 Ollama 在您的計算機上&#xff0c;請使用以下命令 docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gatewa…

docker安裝ros2 并在windows中顯示docker內ubuntu系統窗口并且vscode編程

這里包括docker desktop安裝ros2 humble hawkshill , 安裝xserver(用來在windows中顯示ubuntu中窗口), vscode安裝插件連接docker并配置python的一系列方法 1.安裝xserver 為了能方便的在windows中顯示ubuntu內的窗口,比如rqt窗口 參考文章:https://www.cnblogs.com/larva-zhh…

VMware安裝Centos 9虛擬機+設置共享文件夾+遠程登錄

一、安裝背景 工作需要安裝一臺CentOS-Stream-9的機器環境&#xff0c;所以一開始的安裝準備工作有&#xff1a; vmware版本&#xff1a;VMware Workstation 16 鏡像版本&#xff1a;CentOS-Stream-9-latest-x86_64-dvd1.iso &#xff08;kernel-5.14.0&#xff09; …