优先用 const 声明变量,仅当需重新赋值时才用 let;const 表示绑定不可变,适用于初始化后不重新赋值的场景,包括对象、数组及基本类型;let 用于循环计数、条件分支等需多次赋值的情况。

选对变量声明方式,核心看三个问题:变量会不会被重新赋值?作用域范围多大?需不需要在声明前使用?
用 const 作为默认选择
只要变量初始化后不再指向新值,就优先用 const。它明确表达“这个绑定不可变”,减少意外修改,也利于引擎优化。
- 对象和数组本身可修改,但不能重新赋值:比如 const user = { name: 'Alice' }; 合法,但 user = { name: 'Bob' }; 会报错
- 函数、正则、日期等引用类型同理,只要不重新赋值给该变量名,都适用 const
- 基本类型(string、number、boolean、symbol、bigint)用 const 更安全,避免误覆盖
只有需要重新赋值时才用 let
let 表示“这个变量后续会变”,常见于循环计数器、条件分支中不同赋值、或函数内多次更新的中间状态。
- for 循环中计数器:for (let i = 0; i —— 每次迭代都有独立的 i 绑定
- 不同分支赋不同值:let result; if (ok) { result = 'success'; } else { result = 'fail'; }
- 避免用 let 声明却从不修改的变量,那其实该用 const
尽量避免 var,除非要利用其特性
var 有函数作用域、变量提升、重复声明不报错等行为,在现代代码中容易引发隐蔽 bug,一般不推荐。
立即学习“Java免费学习笔记(深入)”;
- 仅在需要函数级作用域且有意在声明前访问(如老式 IIFE 模式)时才考虑 var
- 不要用 var 声明循环变量,否则闭包中会捕获到同一个变量(如经典的 setTimeout 问题)
- 模块级或顶层作用域中用 var 会挂到全局对象上(浏览器是 window),let/const 不会
作用域和提升是关键区别
var 声明会被提升到函数顶部并初始化为 undefined;let 和 const 虽也被提升,但在声明前访问会触发“暂时性死区”(TDZ),直接报 ReferenceError。
- console.log(a); var a = 1; → 输出 undefined
- console.log(b); let b = 2; → 报错,无法访问
- 这使得 let/const 更符合直觉:先声明再使用


















