核心是通过作用域隔离、模块封装和显式挂载防止变量进入全局作用域:用let/const限定块级作用域;启用"use strict"拦截隐式全局;优先使用es模块实现文件级私有;必须暴露时统一挂载到globalthis.myapp命名空间;极少数场景用symbol作全局键名防冲突。

核心是不让变量进入全局作用域——靠作用域隔离、模块封装和显式挂载守住边界,而不是“少用”或“慎用”全局变量。
用块级或函数作用域包裹变量
let 和 const 声明的变量天然绑定在块({}、if、for、函数)内,外部无法访问:
- 写 if (true) { let token = 'abc'; } 后,console.log(token) 直接报错,不会意外泄露
- 避免裸赋值:timeout = 3000(没加 let/const)在非严格模式下会悄悄挂到 window.timeout 上
- 启用 "use strict" 可让裸赋值立刻抛出 ReferenceError,从源头拦截隐式全局
优先走 ES 模块(ESM)机制
每个 .js 文件在 type="module" 或 .mjs 下默认私有,顶层声明不进全局:
- config.js 中写 export const API_URL = 'https://api.example.com';
- 其他文件只通过 import { API_URL } from './config.js'; 按需使用
- 打包时还能做 tree-shaking,类型系统也更准确
必须暴露时,只交出一个命名空间对象
不散落多个全局标识符,统一挂到单个容器下,兼容浏览器与 Node:
- 声明入口:globalThis.MyApp = globalThis.MyApp || {};
- 所有内容挂载进去:MyApp.utils = { formatDate() { ... } };、MyApp.VERSION = '2.1.0';
- 避免硬写 window.MyApp,用 globalThis 更通用
极少数需扩展全局时,用 Symbol 当键名
适用于 polyfill、框架底层等必须动 globalThis 的场景,避免字符串键名冲突:
- 定义唯一键:const MY_CONFIG = Symbol('my-app-config');
- 挂载:globalThis[MY_CONFIG] = { timeout: 5000 };
- Symbol 键不会被 for...in 遍历,也不会被其他代码覆盖或枚举到
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











