减少全局作用域污染的核心是避免向window或globalthis挂载属性,优先使用es模块、统一命名空间、严格模式、iife等手段隔离作用域并显式暴露必要接口。

减少全局作用域的属性挂载,核心是“不往 window(或 globalThis)上写”,把本该私有的东西留在模块内、函数内或块内,只暴露真正需要跨脚本共享的最小接口。
用 ES 模块替代裸 script
现代浏览器支持 <script type="module"></script>,每个 .js 文件默认就是独立模块作用域:顶层的 const、let、function 不会自动变成 window 属性。
- 删掉旧式
<script src="utils.js"></script>,改用<script type="module" src="main.js"></script> - 在 utils.js 中写
export const formatDate = () => {},其他文件通过import { formatDate } from './utils.js'使用,不污染全局 - 即使没导出,变量也仅限该模块,不会泄漏
统一收敛到一个命名空间对象
如果必须用全局变量(如遗留系统或第三方集成),不要零散挂载,只留一个“入口点”:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 统一初始化:
const APP = window.APP || (window.APP = {}); - 所有功能都挂下面:
APP.api = { login() {} };、APP.ui = { toast() {} }; - 避免直接写
window.init = () => {}或window.config = {}这类泛用名
禁用隐式全局,靠工具兜底
很多全局属性其实不是有意挂的,而是漏写 let/const 导致的意外泄漏:
- 全项目加
"use strict";—— 未声明赋值直接报错,不静默挂到window - ESLint 配置
no-implicit-globals: error,拦截data = []这类写法 - 检查
globalThis属性变化:开发时跑console.log(Object.keys(globalThis))对比引入前后
用 IIFE 封装老代码片段
对无法立即模块化的独立脚本(如统计代码、兼容补丁),用立即执行函数包裹:
- 写法:
(function() { const temp = {}; doSomething(temp); })(); - 内部
temp不会泄漏;若需对外暴露,显式返回并挂到命名空间:APP.tracker = {...} - 比裸写
var tracker = {}安全得多
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










