news 2026/6/9 22:28:23

在 JavaScript 中用 var, let, 以及 const 有什么差別?什么时候该用哪个?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 JavaScript 中用 var, let, 以及 const 有什么差別?什么时候该用哪个?

文章目录

  • 在 JavaScript 中用 var, let, 以及 const 有什么差別?什么时候该用哪个?
    • 1.作用域不同
    • 2.声明上不同
    • 3.变量提升不同
    • 4.const 不允许重新赋值(rebind)
  • 延伸问题:什么时候该用 let ? 什么时候用 const

前置知识:

若不了解 JS 原生值和对象,可以看如下博客JavaScript有哪些数据类型?如何判断一个变量的数据类型?


在 JavaScript 中用 var, let, 以及 const 有什么差別?什么时候该用哪个?

var、let 和 const 是 JavaScript 中用于声明变量的关键字,在 JavaScript 早期只有var,直到 ES2015 (ES6) 时才加入了letconst

他们之间主要有 4 点不同

  • 作用域不同
  • 声明上不同
  • 变量提升上不同
  • const 不允许重新赋值

详细来说,

1.作用域不同

var可以是全局的,可以是以函数作为范围。 let 和 const则是以区块作为范围

2.声明上不同

var 可以反复的被重新声明 但是 let 和 const不行

3.变量提升不同

var 声明的变量会发生提升,在作用域创建阶段即被声明并初始化为 undefined,因此在赋值之前访问该变量不会报错,而是得到 undefined。 但是let和const声明的变量不会自动初始化,而是会进入到暂时死区(TDZ),在声明前使用会报错。

4.const 不允许重新赋值(rebind)

let 和 const 在绝大多数情况都是一样的,二者一个大区别在于,用原生值和对象正常来说是可以重新绑定的(重新绑定赋值),但是 const 不允许

接下来将会一一展开介绍:

1.作用域不同

在作用域上,var可以是全域、也可以是以函数作为范围,letconst則是以区块作为范围。当我們在一个文件的最外层使用var来宣告变量,这时它的范围就是全局,因此当我们在 console 中输入

var greeting = "hello"; window.greeting; // "hello"

其结果是 hello,但是用 let和 const 声明则不会有同样效果,var 除了在全局作用域,var 在某个函数中的范围就是该函数

2.声明上不同

var 可以重复声明

vargreeting="Hello! This ExplainThis :)";vargreeting="ExplainThis is a website that helps you learn programming!";

let 可以重新赋值(rebind),但是不能被重复声明

// 不行!不然会有 SyntaxError: Identifier 'greeting' has already been declaredletgreeting="Hello! This ExplainThis :)";letgreeting="ExplainThis is a website that helps you learn programming!";// 可以letgreeting="Hello! This ExplainThis :)";greeting="ExplainThis is a website that helps you learn programming!";

3.变量提升不同

var 变量提升, 自动初始化

console.log(greeting);// undefinedvargreeting="hi there";

但是letconst则不会,而是會進到暂时死区 (TDZ),因此在letconst声明变量前使用该变量,会出现错误:

console.log(greeting);// Uncaught ReferenceError: greeting is not definedletgreeting="hi there";

补充:

暂时性死区的地方,在这个区域里,任何对该变量的访问都会直接报错。只有当代码执行到声明该变量的那一行时,它才能被“激活”和访问。

4.const 不允许重新赋值(rebind)

const obj = { a: 1 } obj.a = 2 // ✅ 可以 obj.b = 3 // ✅ 可以 obj = { a: 100 } // 不可以,不能 rebind const string="hello world" string="hello js" //不可以,不能 rebind

let 是可以的,当然了 var 也可以

延伸问题:什么时候该用 let ? 什么时候用 const

没有一个标准答案,业界目前普遍的观点是多数时候使用 const,要重复赋值(rebind)的才用 let。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 23:24:43

PCB成型毛刺:从根源控制告别烦恼

PCB 成型后边缘的毛刺,是工程师们最头疼的问题之一。毛刺不仅影响板子的美观,还可能导致短路、划伤元器件,甚至影响产品的可靠性。很多人遇到毛刺,第一反应是 “打磨处理”,但打磨不仅增加了工序成本,还可能…

作者头像 李华
网站建设 2026/6/10 13:21:26

整合单细胞与空间转录组学解析非小细胞肺癌免疫微环境异质性

一、摘要与引言 肺癌是全球范围内发病率位居第二且癌症相关死亡率最高的恶性肿瘤,其复杂的肿瘤生态系统涵盖多种免疫细胞类型。研究表明,骨髓来源细胞,尤其是巨噬细胞,在疾病进展过程中扮演关键角色。为进一步探究肺腺癌&#xf…

作者头像 李华
网站建设 2026/6/10 11:41:40

系统更新后残留的文件在C盘哪个地方?如何清理呢?

theme: default themeName: 默认主题在进行一次大的系统更新后,你可能会发现电脑变慢了,或者c盘空间莫名变少,这通常是因为更新过程留下了一些临时文件,旧的系统备份,以及没有自动移除的无用组件,这些残留文件会弄乱你的c盘,占用本可以用来存放程序,文档和照片的宝贵空间,找到并…

作者头像 李华
网站建设 2026/6/10 9:17:58

SpringData JPA 都能写 SQL,为啥还要用 MyBatis?

SpringData JPA 都能写 SQL,为啥还要用 MyBatis? 之前聊过JPA和MyBatis的核心区别,但总觉得没说透。实际开发里,很多人纠结选哪个,不是因为不知道“JPA面向对象、MyBatis面向SQL”,而是踩过具体的小坑后才…

作者头像 李华
网站建设 2026/6/10 13:47:57

【直播预告】 复刻高德地图导航——GIS开发实战直播来袭!

如果你希望掌握WebGIS开发的核心技能,提升自己在GIS领域的竞争力。本周四下午2点,我们将带来一场适合webgis小白学习的技术直播,使用Vue框架开发高德地图的导航功能。适合人群:对GIS开发感兴趣、想从事地图开发的学生/在职人员。无…

作者头像 李华
网站建设 2026/6/10 12:37:43

基于STM32单片机PM2.5空气质量检测仪粉尘无线视频监控设计套件44(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于STM32单片机PM2.5空气质量检测仪粉尘无线视频监控设计套件44(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码 STM32单片机PM2.5空气质量检测雾霾检测除尘系统44产品功能描述: 本系统由STM32F103C8T6单片机核心板…

作者头像 李华