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…