应优先使用 const 和 let 替代 var:const 用于不可重新赋值的变量,强制初始化且防误改;let 用于需重赋值的场景,具有暂时性死区和块级作用域;彻底禁用 var,并配合严格模式与模块化增强安全性。

直接用 const 和 let 替代 var,就能避开绝大多数变量提升带来的意外行为。关键不是“绕开提升”,而是让提升变得可感知、可控制。
优先用 const 声明不变量
绝大多数变量其实并不需要重新赋值——比如函数参数、API 返回的数据、配置对象、DOM 元素引用等。用 const 声明,既强制你一开始就初始化,又天然防止后续误改绑定:
-
const user = { name: 'Alice' };✅ 合法,对象属性仍可修改 -
user = { name: 'Bob' };❌ 报错:Assignment to constant variable -
const items;❌ 语法错误:const 必须带初始化器
需要重赋值时才用 let
只有明确知道变量后续会多次赋新值(如计数器、临时状态、循环变量),才选用 let。它不会像 var 那样悄悄把声明“漂”到函数顶部并初始化为 undefined,而是进入暂时性死区(TDZ):
-
console.log(count); let count = 0;→ 立即报 ReferenceError - 这比得到一个
undefined更安全——错误在使用前就暴露,而不是在逻辑深处悄悄失效 - for 循环中用
let i,每次迭代都生成独立绑定,避免闭包捕获同一变量的常见 bug
彻底禁用 var,尤其在函数内部
var 的函数作用域 + 声明提升 + 重复声明容忍,是新手出错的高发组合:
立即学习“Java免费学习笔记(深入)”;
- 写
if (ok) { var msg = 'done'; },msg在整个函数内都存在,但可能未定义 - 同名变量内外遮蔽(shadowing)导致读取
undefined却难以察觉 - 老项目维护除外,新代码里应完全不出现
var
配合严格模式和模块化加固
即使用了 let/const,也建议主动启用防护层:
- 在脚本顶部加
"use strict";,让隐式全局(如漏写let直接赋值)立刻报错 - 用
.mjs后缀或<script type="module"></script>,模块环境默认严格模式且顶层变量不挂window - ESLint 开启
no-var和no-implicit-globals规则,在编码阶段拦截风险


















