核心是防止变量、函数或对象意外挂到window或globalThis上,通过作用域控制和结构隔离锁住变量生命周期:用let/const替代var、启用"use strict"、IIFE封装、单一命名空间收敛、ES模块化及类静态属性替代全局缓存。

核心是不让变量、函数或对象意外挂到 window(浏览器)或 globalThis 上,通过作用域控制和结构隔离主动“锁住”变量生命周期。
用块级/函数作用域代替顶层声明
避免在脚本最外层用 var 声明变量——它会自动成为 window 的属性。改用 let 或 const,并包裹在函数或代码块中:
-
let config = { apiBase: '/v1' };→ 不会挂到window - 直接写
counter = 0(没声明)→ 隐式挂到window.counter,必须杜绝 - 启用
"use strict",让隐式赋值直接报错,从源头拦截
用 IIFE 创建私有执行环境
适合无构建工具的老项目或内联脚本,把实现细节完全隔开:
- 立即执行函数内部的
const、let、function全部不泄露 - 只显式暴露必要接口:
window.MyApp = { request, init } - 可加命名空间存在性检查:
if (!window.MyApp) window.MyApp = {};
收敛到单一命名空间对象
若必须提供全局入口(如 SDK、插件),只暴露一个顶层标识符,其余全挂在其下:
立即学习“Java免费学习笔记(深入)”;
-
window.AcmeUtils = {};→ 全局只多一个AcmeUtils AcmeUtils.dom.hide = function(el) { el.style.display = 'none'; };- 支持嵌套:
AcmeUtils.data.cache.set(key, val),用工具函数自动建路径
优先采用 ES Module 天然隔离
现代项目应默认走模块化路线,这是最彻底的解耦方式:
- 每个
.js文件默认是独立模块作用域,const/function不上window - 用
export显式导出,import显式引入,依赖关系清晰 - 类静态属性替代全局缓存:
class ApiCache { static store = new Map() },模块内私有,无法误改


















