let 声明
最后更新:2026-09-09
let 声明
let 用来声明一个块级作用域的变量:它只在自己所在的那对大括号 {} 里有效,出了大括号就访问不到,同一个作用域里也不能重复声明同名变量。这是 ES6 引入的现代写法,日常开发应优先用它代替 var。
| 分类 | 变量声明 |
|---|---|
| 作用域 | 块级作用域({} 内) |
| 变量提升 | 有提升,但存在暂时性死区,声明前访问会报错 |
| 重复声明 | 同一作用域不允许 |
| 重新赋值 | 允许 |
| ES 版本 | ES6(2015) |
📝 语法
let 变量名 = 初始值;
⚙️ 参数
| 变量名 | 遵循标识符规则:以字母、下划线 _ 或美元符 $ 开头,区分大小写,不能使用保留字。 |
|---|---|
| 初始值 | 可选。省略时变量值为 undefined,之后可以随时重新赋值。 |
返回值:不返回值,let 是一条声明语句而不是表达式。
是否修改原值:否(返回新值)
▶ 示例
编辑下方代码,点击运行,在输出面板查看结果:
运行结果:
2
只在块内可见
报错:ReferenceError
💡 提示 循环里用 let 声明计数器,每一次迭代都会创建一个新的绑定,配合 setTimeout 能拿到当次的值;换成 var 则会全部拿到最后一个值。
⚠️ 警告 同一作用域内重复 let 声明同一个变量名会直接抛出 SyntaxError,不像 var 那样静默覆盖——这能帮你提前发现命名冲突。
🌐 浏览器支持
| 浏览器 | |||||
|---|---|---|---|---|---|
| let | ✓ v49 | ✓ v12 | ✓ v44 | ✓ v10 | ✓ v36 |
| 所有现代浏览器均支持 | |||||
🏷️ 相关语句
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Qlet 和 var 到底有什么区别?
A三点:一是作用域,let 是块级({} 内有效),var 是函数级甚至会挂到全局对象上;二是重复声明,let 不允许,var 允许;三是提升行为,let 存在暂时性死区,声明前访问直接报错,var 则是拿到 undefined 静默通过。
Q为什么在 let 声明之前使用变量会报错?
A从进入作用域到真正执行到 let 声明语句之间的这段区域叫暂时性死区(TDZ)。变量虽然已经被“登记”,但还没有初始化,此时访问就会抛出 ReferenceError。这是设计上的保护,能避免像 var 那样悄悄拿到 undefined 造成的隐蔽 bug。
Q循环里的 let 为什么每次都不一样?
A用 let 声明的循环变量,JavaScript 会在每一次迭代时创建一个新的副本并记住上一轮的值,所以每个闭包捕获到的都是各自那一轮的值;用 var 则整个循环共用一个变量,回调执行时只剩下最后一次的结果。