【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 "…