const声明常量需配合作用域管理才能避免全局污染:应置于函数、iife或es模块内;必要时挂载到命名空间对象或用named export;极少数场景可用symbol作唯一键名。

直接用 const 声明常量本身并不能防止全局污染——关键在于声明位置和作用域管理。把 const 放在顶层(比如脚本最外层),它仍是全局的;只有配合作用域控制,才能真正隔离。
只在函数或模块内声明 const
避免在全局作用域写 const API_URL = 'https://api.example.com';。应将其包裹在函数、IIFE 或模块中:
- 函数内:在工具函数里定义配置常量,仅该函数及其闭包可访问
- IIFE 中:适合老项目或内联脚本,
(function() { const TIMEOUT = 5000; /* 使用 */ })(); - ES 模块内:现代首选,
const DEBUG = false;默认不暴露,需显式export
统一挂载到命名空间对象
若必须对外提供常量,不要零散暴露,而是集中在一个命名空间下:
- 写法:
window.MyApp = window.MyApp || {}; MyApp.VERSION = '2.1.0'; MyApp.MAX_RETRY = 3; - 好处:所有常量归属清晰,不会和
jQuery、lodash等库冲突 - 兼容性:可用
typeof window !== 'undefined' ? window : globalThis判断宿主
用 ES 模块 + named export 替代全局常量
这是最干净的方式。每个常量文件只负责定义,不执行副作用:
-
constants.js:export const STATUS_OK = 200; export const TOKEN_KEY = 'auth_token'; -
main.js:import { STATUS_OK, TOKEN_KEY } from './constants.js'; - 优势:打包工具能做 tree-shaking,运行时无全局变量,类型系统也更友好
必要时用 Symbol 作唯一键名
极少数场景需扩展全局环境(如 polyfill),可用 Symbol 避免字符串键名冲突:
const MY_CONFIG = Symbol('my-app-config');globalThis[MY_CONFIG] = { timeout: 3000 };- 比
globalThis.myAppConfig更安全,无法被枚举或意外覆盖
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











