避免全局变量污染的核心是杜绝变量落入全局作用域,通过作用域隔离(函数/块级作用域)、模块封装(ES模块)、显式挂载(命名空间对象或globalThis+Symbol)来守住边界。

避免全局变量污染导致的命名冲突,核心是不让变量直接落在全局作用域里。不是“少用全局变量”,而是从一开始就不让它成为全局变量——靠作用域隔离、模块封装和显式挂载来守住边界。
用函数或块级作用域包裹变量
函数天然创建独立作用域,let/const 声明的变量不会逃逸出去:
- 在函数内写 let apiTimeout = 5000,这个变量只属于该函数,外部完全不可见
- 避免裸赋值:apiTimeout = 5000(没加 let/const)会悄悄挂到 window 上,启用 "use strict" 可让这种写法直接报错
- 简单脚本可用 IIFE 快速隔离:(function() { const TOKEN = 'abc'; /* 其他逻辑 */ })();
统一挂到一个命名空间对象下
如果必须对外暴露,不散落多个全局标识符,只交出一个“入口”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先声明顶层容器:window.MyApp = window.MyApp || {};
- 再把变量、函数、常量都挂进去:MyApp.API_URL = 'https://api.example.com'; MyApp.utils = { formatDate() { ... } };
- 兼容 Node.js 或新环境时,用 globalThis.MyApp = globalThis.MyApp || {}; 替代硬写 window
优先走 ES 模块机制
现代项目中,这是最干净、最彻底的解法——每个文件默认就是私有作用域:
立即学习“Java免费学习笔记(深入)”;
- 在 config.js 中写:export const BASE_URL = 'https://api.example.com'; export const RETRY_LIMIT = 3;
- 在其他文件中按需导入:import { BASE_URL } from './config.js';
- 所有变量不会出现在全局,打包工具还能做 tree-shaking,类型系统也更友好
极少数必须扩展全局时,用 Symbol 作键名
比如写 polyfill 或框架底层逻辑,需要往 globalThis 上加东西,但又怕字符串重名:
- 定义唯一键:const MY_SETTINGS = Symbol('my-app-settings');
- 挂载:globalThis[MY_SETTINGS] = { timeout: 3000, debug: true };
- Symbol 键无法被 for...in 遍历,也不会被其他代码意外覆盖,比 globalThis.mySettings 安全得多

















