news 2026/7/15 15:10:55

Vue3:let、const 和 var区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3:let、const 和 var区别

Vue3:let、const 和 var区别

  • 1. 核心区别概览表
  • 2. 详细解析
    • 2.1 作用域(Scope)
    • 2.2 变量提升与暂时性死区(TDZ)
    • 2.3 重复声明
    • 2.4 赋值与修改(重点:const 的特性)
  • 3. Vue 3 中的最佳实践
    • 3.1 优先使用 `const`
    • 3.2 必要时使用 `let`
    • 3.3 避免使用 `var`
  • 4.总结

在 Vue 3(以及现代 JavaScript/TypeScript)开发中,letconstvar是三种声明变量的方式。虽然它们都用于定义变量,但在作用域、变量提升、重复声明以及赋值规则上存在本质区别。

在 Vue 3 的最佳实践中,推荐遵循 “默认使用const,需要重新赋值时使用let,尽量避免使用var” 的原则。

1. 核心区别概览表

特性varletconst
作用域函数作用域 / 全局作用域块级作用域 ({})块级作用域 ({})
变量提升有(初始化为undefined有(但存在暂时性死区 TDZ)有(但存在暂时性死区 TDZ)
重复声明允许(后声明覆盖前声明)禁止(同一作用域报错)禁止(同一作用域报错)
重新赋值允许允许禁止(常量)
初始化要求可选可选必须初始化赋值
Vue3 推荐度❌ 不推荐✅ 常用(响应式数据需修改时)✅✅ 首选(大多数情况)

2. 详细解析

2.1 作用域(Scope)

  • var:只有函数作用域或全局作用域。在ifforwhile等代码块中声明的var变量,在代码块外部依然可以访问,这容易导致变量污染。
  • let/const:拥有块级作用域。变量只在最近的{}内有效。这在 Vue 3 的组合式 API(<script setup>)中尤为重要,因为逻辑通常包裹在各种函数或条件判断中,块级作用域能有效隔离变量,避免命名冲突。
// var 示例:泄露到外部if(true){vara=1;}console.log(a);// 1 (可以访问,容易出错)// let/const 示例:隔离在块内if(true){letb=2;constc=3;}console.log(b);// ReferenceError: b is not definedconsole.log(c);// ReferenceError: c is not defined

2.2 变量提升与暂时性死区(TDZ)

  • var:存在变量提升。在声明之前访问变量,结果为undefined,不会报错。
  • let/const:虽然底层也有提升机制,但在声明语句执行之前,变量处于暂时性死区(Temporal Dead Zone, TDZ)。如果在声明前访问,会直接抛出ReferenceError。这有助于在开发阶段尽早发现错误。
console.log(x);// undefined (var 提升,不报错)varx=10;console.log(y);// ReferenceError: Cannot access 'y' before initializationlety=20;

2.3 重复声明

  • var:允许在同一作用域内多次声明同名变量,后面的声明会覆盖前面的。
  • let/const:禁止在同一块级作用域内重复声明同名变量,否则编译/运行时报错。这增强了代码的安全性。
varm=1;varm=2;// 合法,m 变为 2letn=1;letn=2;// SyntaxError: Identifier 'n' has already been declared

2.4 赋值与修改(重点:const 的特性)

  • var/let:声明后可以随意重新赋值。
  • const:声明的是常量,指向的内存地址不可变。
    • 基本数据类型(Number, String, Boolean):值不可修改。
    • 引用数据类型(Object, Array):地址不可改,但内部属性/元素可改。
// 基本类型constPI=3.14;PI=3.15;// TypeError: Assignment to constant variable.// 引用类型constuser={name:'Alice'};user.name='Bob';// ✅ 合法:修改对象内部属性user={name:'Charlie'};// ❌ 报错:试图改变变量指向的地址

3. Vue 3 中的最佳实践

在 Vue 3 的<script setup>或组合式 API 中,变量声明的选择直接影响代码的可读性和健壮性。

3.1 优先使用const

绝大多数情况下,你应该使用const。即使是一个对象或数组,只要你不需要替换整个对象/数组(即不改变引用指向),就应该用const

import{ref,reactive}from'vue'// ✅ 推荐:ref 返回的是一个对象,我们不需要替换这个 ref 对象本身,而是修改其 .valueconstcount=ref(0)constlist=ref([])// ✅ 推荐:reactive 返回的是代理对象,同样不需要替换变量指向conststate=reactive({name:'Vue',version:3})// ✅ 推荐:普通常量constMAX_RETRY=3

3.2 必要时使用let

只有当你确实需要重新赋值整个变量(改变引用指向)时,才使用let

// 场景1:需要根据条件完全替换一个对象或数组letuserList=ref([])asyncfunctionfetchData(){// 这里我们需要替换整个 ref 的 value,或者替换一个普通变量constdata=awaitapi.getUsers()userList.value=data// 注意:如果是 ref,修改的是 .value,变量 userList 本身没变,所以 userList 可以用 const// 如果是普通变量需要重赋值:lettempStr='hello'tempStr='world'// 必须用 let}// 场景2:循环计数器或中间变量for(leti=0;i<10;i++){console.log(i)}

注意:在 Vue 3 中,即使是响应式数据refreactive,变量本身(即持有 ref 对象的标识符)通常是不变的,我们改变的是它们的内部状态(.value或属性)。因此,声明 ref/reactive 变量时也应使用const

3.3 避免使用var

  • var没有块级作用域,容易在复杂的组件逻辑中造成变量泄露或意外覆盖。
  • var的变量提升行为可能导致难以排查的 Bug(如访问到undefined而不是预期的值)。
  • Vue 3 基于 ES Module 和现代构建工具,完全支持 ES6+ 语法,没有理由继续使用var
  1. 常见面试题:For 循环中的闭包问题

这是理解letvar区别的经典案例:

// 使用 varfor(vari=0;i<5;i++){setTimeout(()=>{console.log(i);// 输出: 5, 5, 5, 5, 5},1000);}// 原因:var 只有函数/全局作用域,所有定时器共享同一个 i,循环结束时 i 为 5。// 使用 letfor(letj=0;j<5;j++){setTimeout(()=>{console.log(j);// 输出: 0, 1, 2, 3, 4},1000);}// 原因:let 具有块级作用域,每次循环都会创建一个新的绑定(副本),每个定时器捕获各自的 j。

4.总结

在 Vue 3 开发中:

  1. 忘掉var:除非维护极老的遗留代码,否则不再使用。
  2. 默认const:声明refreactive、计算属性、函数、常量时,一律使用const
  3. 按需let:仅当变量需要被重新赋值(re-assignment)时才使用let
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 15:10:28

CANN/asc-devkit原子操作关键特性

关键特性说明 确定性计算是指在相同输入条件下&#xff0c;无论执行次数或执行环境如何变化&#xff0c;总能产生完全一致输出结果的计算过程。确定性计算为系统稳定性和实验可验证性提供保障。 确定性计算概述 为引出原子操作场景下非确定性计算的问题&#xff0c;我们构建…

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

ncmdumpGUI:如何有效解决网易云音乐NCM格式的跨平台播放难题

ncmdumpGUI&#xff1a;如何有效解决网易云音乐NCM格式的跨平台播放难题 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 网易云音乐的NCM加密格式在保护数字音…

作者头像 李华
网站建设 2026/7/15 15:07:43

GetQzonehistory技术方案:构建QQ空间历史数据本地化归档系统

GetQzonehistory技术方案&#xff1a;构建QQ空间历史数据本地化归档系统 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在社交媒体数据管理日益重要的今天&#xff0c;个人数字资产的安…

作者头像 李华
网站建设 2026/7/15 15:07:29

机器视觉全自动检测核心优势

一、检测精度更高&#xff0c;微小缺陷不漏检1. 搭配工业相机、远心镜头、专业光源&#xff0c;可识别微米级瑕疵&#xff08;划痕、微裂纹、麻点、磕碰&#xff09;&#xff0c;远超肉眼分辨极限&#xff1b;2. 多角度、360环绕成像&#xff0c;无视觉死角&#xff0c;齿轮齿根…

作者头像 李华
网站建设 2026/7/15 15:07:21

齿轮360°环绕式全自动视觉检测系统介绍

一、系统简介 齿轮360环绕视觉全自动检测系统&#xff0c;针对齿轮锻件、车削半成品、滚齿/磨齿半成品、装配成品齿轮开发&#xff0c;采用多相机环形环绕成像伺服分度旋转机构深度学习AI视觉算法&#xff0c;一次性完成齿轮端面、外圆、全部齿面、齿根、倒角、内孔、键槽全方…

作者头像 李华
网站建设 2026/7/15 15:06:02

昇腾C GatherMask函数文档

GatherMask 产品支持情况 产品 是否支持 Ascend 950PR/Ascend 950DT √ Atlas A3 训练系列产品/Atlas A3 推理系列产品√ Atlas A2 训练系列产品/Atlas A2 推理系列产品√ Atlas 200I/500 A2 推理产品√ Atlas 推理系列产品AI Core √ Atlas 推理系列产品Vector Core x Atlas …

作者头像 李华