var、let、const 完整使用教程(前端必学ES6变量声明)

📅 2026/6/30 3:43:45
var、let、const 完整使用教程(前端必学ES6变量声明)
在 JavaScript 开发中变量声明是最基础、最核心的语法。ES5 时期仅有var一种声明方式存在作用域混乱、变量污染、重复声明等诸多问题。ES6 重磅推出let和const彻底解决了旧语法的缺陷成为现代前端开发的标准变量声明方案。本文将全面讲解 var、let、const 的语法特性、核心差异、使用场景及避坑技巧零基础可看懂适配日常开发、面试笔试所有场景。一、三者核心差异总览先通过对照表快速掌握三者核心区别建立整体认知后续逐一详解对比特性varES5letES6constES6作用域规则函数作用域无块级作用域块级作用域{} 包裹范围块级作用域{} 包裹范围变量提升存在提升可先使用后声明值为 undefined存在提升存在暂时性死区禁止先使用后声明存在提升存在暂时性死区禁止先使用后声明重复声明允许重复声明同一变量同作用域禁止重复声明同作用域禁止重复声明赋值规则可不初始化默认 undefined可重复赋值可不初始化默认 undefined可重复赋值必须初始化赋值禁止直接修改内存地址全局挂载全局声明会挂载到 window 对象全局声明不挂载到 window 对象全局声明不挂载到 window 对象使用推荐不推荐废弃语法声明可变变量声明常量默认首选二、var 详细解析ES5 旧语法彻底不推荐var 是 JavaScript 最初的变量声明方式语法简陋存在大量设计缺陷现代开发中已完全被淘汰仅需了解其特性用于兼容旧代码。1. 仅拥有函数作用域无块级作用域var 只受函数限制作用域if、for、while、普通 {} 代码块无法隔离变量极易造成全局变量污染。// 块级代码无法限制 var 变量 if (true) { var num 100; } console.log(num); // 100块外可访问变量泄露 // 函数可以限制 var 变量 function fn() { var msg hello; } console.log(msg); // 报错msg is not defined函数外无法访问2. 变量提升特性JS 代码执行前解析器会将 var 变量的声明提升到当前作用域顶部赋值操作保持在原位置。因此 var 变量可以先使用、后声明不会报错值为 undefined。console.log(a); // undefined不报错 var a 20; // 代码实际执行顺序 var a; console.log(a); a 20;3. 允许重复声明变量var 允许在同一作用域中重复声明同一个变量不会报错会直接覆盖之前的值极易引发隐蔽 bug。var name 张三; var name 李四; // 重复声明不报错 console.log(name); // 李四4. 全局变量挂载到 window全局作用域下使用 var 声明的变量会自动成为 window 对象的属性容易与原生方法冲突污染全局环境。var age 18; console.log(window.age); // 18三、let 详细解析ES6 可变变量声明let 是 ES6 专门为解决 var 缺陷设计的变量声明方式用于声明值会发生变化的变量是可变变量的首选方案。1. 经典块级作用域let 拥有严格的块级作用域凡是 {} 包裹的代码块if、for、while、单独代码块都会隔离变量彻底解决变量污染问题。if (true) { let count 10; console.log(count); // 10块内可访问 } console.log(count); // 报错count is not defined块外无法访问2. 暂时性死区核心特性let 存在变量提升但禁止在声明前使用变量。变量从代码块开始到声明语句之前的区域被称为「暂时性死区」在此区域使用变量会直接报错。console.log(b); // 报错Cannot access b before initialization let b 30;3. 禁止同作用域重复声明在同一个作用域中let 不允许重复声明同名变量有效避免变量覆盖 bug。let str 前端教程; let str JS教程; // 报错Identifier str has already been declared4. 可重复赋值不可全局挂载let 声明的变量值可以随时修改但不会挂载到 window 对象全局环境更干净。let score 60; score 90; // 允许重新赋值 console.log(score); // 90 // 全局let变量不挂载window let test 100; console.log(window.test); // undefined四、const 详细解析ES6 常量声明默认首选const 用于声明只读常量是现代开发中默认推荐的声明方式。只要变量值不会被重新赋值优先使用 const仅值需要变动时改用 let。1. 必须初始化赋值const 声明的是常量不允许为空声明必须在声明时直接赋值否则直接报错。const PI; // 报错Missing initializer in const declaration const PI 3.14159; // 正确写法2. 禁止修改内存地址核心误区详解很多新手会误解 const 完全不可修改实则const 仅锁定内存地址不锁定引用类型内部数据基本数据类型数字、字符串、布尔值存在内存地址中无法修改引用数据类型数组、对象地址不变内部属性/元素可以修改// 1. 基本类型无法修改 const num 10; num 20; // 报错Assignment to constant variable // 2. 引用类型内部数据可修改 const arr [1, 2, 3]; arr.push(4); // 允许修改内部元素 console.log(arr); // [1,2,3,4] arr [5,6]; // 报错修改了数组内存地址不允许3. 继承 let 所有优质特性const 同样拥有块级作用域、暂时性死区、禁止重复声明、不挂载 window特性和 let 规则完全一致。五、三大变量声明使用场景规范开发必守掌握特性后统一开发规范告别随意声明变量代码更严谨、更少出 bug1. 绝对禁止使用 var所有新项目、新代码一律摒弃 var避免变量提升、作用域混乱、全局污染等问题。2. 默认优先使用 const90% 的场景都可以使用 const包括固定配置、接口地址、DOM 节点、静态数组/对象、不会变动的标识等。// 配置常量 const BASE_URL https://xxx.com/api; // DOM元素 const box document.querySelector(.box); // 静态数据 const USER_INFO { name: 张三, id: 1 };3. 仅可变变量使用 let仅当变量值需要主动重新赋值时使用 let比如计数器、状态变量、循环变量、动态数据等。// 计数器 let count 0; count; // 动态状态 let status pending; status success; // for循环变量 for (let i 0; i 5; i) {}六、高频面试 开发避坑总结1. 核心面试题答案为什么废弃 var无块级作用域、变量提升混乱、可重复声明、污染全局let、const 区别let 可赋值可不初始化const 必须初始化、禁止修改地址暂时性死区let/const 声明前的区域禁止访问变量解决 var 提升乱象2. 日常开发避坑点for 循环必须用 let不能用 var避免循环变量全局泄露、循环闭包 bug声明对象/数组优先用 const只有重新赋值整个对象时才用 let不要混用 var、let、const统一 ES6 语法规范七、最终总结1.varES5 废弃语法作用域混乱、bug 极多永远不要使用2.let块级作用域、无变量污染专门用于值会变化的变量3.const性能最优、约束最强默认首选用于所有固定值变量4. 开发黄金规则能用 const 就用 const不能用再用 let坚决不用 var。来源www.113h.cn来源m.113h.cn来源163.113h.cn来源618.113h.cn来源a.113h.cn来源1.113h.cn来源we.113h.cn来源wap.113h.cn来源app.113h.cn来源dnf.113h.cn来源lpl.113h.cn来源h5.113h.cn来源bbs.113h.cn来源b.113h.cn来源c.113h.cn来源web.113h.cn来源cs.113h.cn来源g2.113h.cn来源t1.113h.cn来源i7.113h.cn