避免全局变量的核心是控制作用域可见性,而非回避顶层声明;启用严格模式、使用ES模块、函数内显式声明、IIFE封装等是有效手段。

直接在脚本最外层写 let、const 或 var,变量仍会挂到全局作用域(浏览器中即 window),但现代开发中真正危险的不是“显式声明的顶层变量”,而是“未声明就赋值”和“非模块环境下的随意暴露”。避免全局变量的核心是控制作用域可见性,而不是回避顶层声明本身。
启用严格模式强制报错
在文件顶部或函数开头加一行:
-
"use strict";—— 这会让count = 10这类未声明赋值立刻抛出ReferenceError,而不是悄悄变成window.count - 它还能阻止
eval泄漏变量、禁止给只读属性赋值等隐式副作用 - ES 模块(
.mjs或<script type="module"></script>)默认启用严格模式,无需手动加
用模块封装代替脚本直连
把代码放进模块文件(如 utils.js),天然隔离作用域:
- 顶层的
const API_URL = 'https://api.example.com'不会出现在window上 - 必须通过
export显式导出,其他文件用import才能访问 - 即使不写
"use strict",模块内未声明赋值也会报错
函数内始终显式声明变量
哪怕只是临时计算,也别跳过关键字:
- ❌ 错误:
result = x + y;→ 隐式挂到window.result - ✅ 正确:
const result = x + y;或let result = x + y; - ⚠️ 警惕链式赋值:
let a = b = 0;实际上b是隐式全局 —— 应拆成let a, b; a = b = 0;
老项目补救:IIFE 或命名空间包装
无法立刻转模块时,用立即执行函数包裹逻辑:
(function() { const config = { debug: true }; console.log(config.debug); })();- 内部所有变量都局限在此函数作用域,不会污染
window - 若需有限暴露,可返回对象:
const MyApp = (function() { return { init() { ... } }; })();
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











