优先使用 let 和 const 替代 var,利用块级作用域和模块化设计避免作用域污染;const 用于不重赋值变量,let 仅用于需重赋值场景;变量应在最小必要作用域内就近声明。

用 let 和 const 替代 var,并配合块级作用域和模块化设计,是避免作用域污染最直接有效的方式。
优先使用 let 和 const
var 声明的变量存在变量提升(hoisting)和函数作用域问题,容易意外覆盖外层同名变量或造成全局泄漏。而 let 和 const 具有块级作用域,且不会被提升到块外访问。
- 用
const声明不重新赋值的变量(推荐默认使用) - 仅在需要重新赋值时用
let - 完全避免
var,尤其在循环、条件语句或嵌套函数中
限制变量声明位置,缩小作用域范围
变量越早定义在最小所需作用域内,污染风险越低。不要把所有变量都放在函数顶部或全局。
- 在
if、for、while等块内部直接声明变量,而不是提前放到函数开头 - 循环中避免用
let i = 0声明在循环外,改用for (let i = 0; i —— 每次迭代都有独立绑定 - 函数参数本身就是局部变量,无需额外用
let重声明
启用严格模式并借助模块系统隔离全局空间
在文件顶部加 "use strict" 可防止意外创建全局变量(如忘记写 let/const 直接赋值会报错)。更进一步,使用 ES 模块(import/export)天然提供模块级作用域。
立即学习“Java免费学习笔记(深入)”;
- 每个
.js文件默认是独立模块,顶层声明不会自动挂到window或globalThis - 显式导出需要暴露的接口,其余变量默认私有
- 避免在浏览器中直接写
<script></script>内联脚本(易污染全局),改用type="module"
谨慎处理闭包与异步回调中的变量引用
闭包常因变量捕获不当导致“意外共享”,尤其在循环中创建多个异步操作时。
- 避免用
var在循环中定义计数器并传入setTimeout等异步回调 - 使用
let可解决经典“循环输出 5 个 5”问题,因其为每次迭代创建新绑定 - 必要时用 IIFE(立即执行函数)或提取成独立函数来固化当前值


















