news 2026/7/10 5:47:36

深入理解 JavaScript 中 var、let、const 的核心区别与最佳实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入理解 JavaScript 中 var、let、const 的核心区别与最佳实践

摘要:本文系统对比了 JavaScript 中varletconst三种变量声明方式的核心差异。从作用域、变量提升与暂时性死区、重复声明规则以及赋值规则四个维度展开,详细阐述了var的函数作用域、变量提升、允许重复声明和灵活赋值特性,以及let/const的块级作用域、暂时性死区、禁止重复声明等 ES6 新规范。重点强调了const作为常量的初始化要求和不可变性规则。全文结合代码示例和图解,旨在帮助开发者深入理解并正确选用变量声明关键字。

目录

  • 一、作用域不同
    • 1. var:函数作用域
    • 2. let:块级作用域
    • 3. const:块级作用域
  • 二、变量提升与暂时性死区
    • 1. var:存在变量提升
    • 2. let:不存在变量提升,存在暂时性死区
    • 3. const:同 let,存在暂时性死区
  • 三、重复声明规则
    • 1. var:允许重复声明
    • 2. let:不允许重复声明
    • 3. const:不允许重复声明
  • 四、赋值规则与常量特性
    • 1. var:声明时可不赋值,可随意修改
    • 2. let:声明时可不赋值,可修改值
    • 3. const:声明时必须赋值,且不可重新赋值

前言

在 ES6(ECMAScript 2015)推出之前,JavaScript 声明变量只有var一种方式。ES6 新增了letconst两个关键字,彻底改变了前端变量声明的规范。三者在作用域、变量提升、重复声明、赋值规则等方面存在本质差异,也是前端面试的高频考点。本文将从底层机制出发,全面拆解三者的区别,所有结论均符合 ECMAScript 官方标准。

一、作用域不同

作用域决定了变量在代码中的可访问范围,这是三者最核心的区别。

1. var:函数作用域

var声明的变量只受函数作用域限制,不存在块级作用域。在iffor{}等代码块中声明的var变量,在块外部依然可以访问。

2. let:块级作用域

let声明的变量拥有块级作用域,仅在当前代码块({}包裹的区域)内有效,外部无法访问。

3. const:块级作用域

constlet作用域规则完全一致,均为块级作用域,仅在声明的代码块内有效。

二、变量提升与暂时性死区

1. var:存在变量提升

var声明的变量会被提升到当前作用域的顶部,赋值操作留在原地。在声明之前访问变量,会得到undefined而非报错。

2. let:不存在变量提升,存在暂时性死区

let声明的变量不会被提升,在声明语句之前访问该变量,会直接抛出ReferenceError。从代码块开始到变量声明语句之间的区域,称为暂时性死区

3. const:同 let,存在暂时性死区

constlet规则一致,声明前访问同样会报错。

三、重复声明规则

1. var:允许重复声明

同一作用域内,var可以多次声明同一个变量,后声明的会覆盖前者,不会报错。

2. let:不允许重复声明

同一作用域内,let不能重复声明同一个变量,否则直接报错。

3. const:不允许重复声明

let一致,同一作用域内不可重复声明。

四、赋值规则与常量特性

1. var:声明时可不赋值,可随意修改

var声明时可以不赋值,默认值为undefined,后续可任意修改值和类型。

2. let:声明时可不赋值,可修改值

let声明时可以不赋值,后续可重新赋值,也可修改数据类型。

3. const:声明时必须赋值,且不可重新赋值

const代表常量,声明时必须立即初始化,不能留到以后赋值。且声明后,基本数据类型的值不可修改,引用数据类型的内存地址不可修改。

五、总结与最佳实践

通过前文对比,我们可以将varletconst的核心差异总结如下:

特性varletconst
作用域函数作用域块级作用域块级作用域
变量提升存在(提升为undefined不存在(存在暂时性死区)不存在(存在暂时性死区)
重复声明允许不允许不允许
初始赋值可不赋值(默认undefined可不赋值(默认undefined必须赋值
重新赋值允许允许不允许(基本类型值不可变,引用类型地址不可变)

在不同开发场景下的选用建议:

  1. 循环场景(如 for、while)
    • 优先使用let:循环计数器、临时迭代变量等需要块级作用域隔离,避免变量泄露到外部。
    • 避免使用varvar会导致循环变量泄露,可能引发意外覆盖。
    • const仅用于循环内不会重新赋值的常量(如迭代配置对象)。
  2. 常量定义
    • 必须使用const:用于声明不会重新赋值的常量,如配置项、枚举值、数学常数等。
    • 确保初始化时赋值,且后续不修改其值(对于对象/数组,可修改内部属性,但不能重新赋值整个变量)。
  3. 模块化开发(ES6 Module)
    • 导出接口、工具函数、类定义等,优先使用const保证引用稳定。
    • 模块内部私有变量、状态管理,根据是否需要重新赋值选择letconst
    • 现代前端框架(React、Vue)中,组件状态、响应式数据通常使用const声明(配合框架的响应式系统更新值)。
  4. 函数内部变量
    • 默认使用const,只有当变量需要重新赋值时才改用let
    • 基本淘汰var,除非维护遗留代码或特定需要函数作用域的场景。
  5. 全局变量与顶层声明
    • 在全局作用域或模块顶层,优先使用const声明常量,使用let声明可修改变量。
    • 避免使用var污染全局对象(浏览器中var声明的全局变量会成为window属性)。

通用最佳实践:

  • 默认使用const,只有当变量需要重新赋值时才改用let
  • 基本不用var,除非在 ES5 环境或特定需要函数作用域/变量提升的场景。
  • 声明变量时尽量初始化,避免出现undefined的中间状态。
  • 利用块级作用域和暂时性死区减少变量污染和提升相关 bug。
  • 使用 ESLint 等工具配置规则(如no-varprefer-const)强制代码规范。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 5:46:08

晶圆厂‘船票’:芯片设计准入的三重硬门槛解析

1. “船票”不是比喻,是半导体产业真实存在的准入通行证最近刷到一条消息:“亚马逊又拿到船票了,这次是芯片”,不少朋友第一反应是——这说的是哪趟船?游轮?货轮?还是什么新出的AI航海梗&#x…

作者头像 李华
网站建设 2026/7/10 5:44:15

曝光!这5大诚信薄膜拉力试验机排行,你千万不能错过!

在薄膜、胶粘剂、高分子材料等众多新兴行业中,对材料力学性能的精密测试需求日益增长。无论是评估新能源电池隔膜的拉伸强度,还是检验柔性显示屏复合薄膜的剥离性能,一台精度高、稳定性好、信誉可靠的薄膜拉力试验机都是确保产品研发与质量控…

作者头像 李华
网站建设 2026/7/10 5:43:52

投标软件性能测试复测费用怎么算?

用来投标的软件性能测试报告, 整改之后的复测该怎么计算? 这可不单单只是预算方面的问题, 它更是项目交付过程中的关键节点。结论是非常明确的: 复测所需的费用可不是简单地进行打折处理, 而是要依据“回归范围”以及“责任归属”来重新进行核定的。大多数的招标方默认在初测不…

作者头像 李华
网站建设 2026/7/10 5:41:53

深度学习训练与评估GPU资源差异分析及优化策略

在深度学习和大模型训练的实际项目中,很多科研人员都遇到过这样的现象:模型训练需要消耗海量GPU资源(如5e27 GPU小时),而模型评估阶段却只需要极少的计算时间(如1e-2小时)。这种巨大的时间差异背…

作者头像 李华
网站建设 2026/7/10 5:41:29

减脂/增肌计划:AI 智能健身训练系统的鸿蒙实现

减脂/增肌计划:AI 智能健身训练系统的鸿蒙实现 一、引言 健身训练计划的制定是一项专业性很强的工作。不同的目标(减脂 vs 增肌)、不同的训练水平(新手 vs 进阶)、不同的训练频率(每周1-7天)&am…

作者头像 李华