避免全局污染的关键是“管住全局”:只暴露一个顶层命名空间(如window.MyApp = MyApp || {}),用IIFE封装模块实现私有作用域,优先采用ES Module,动态执行改用Function构造函数并严格校验。

避免全局作用域的变量污染和命名冲突,关键不是“不用全局”,而是“管住全局”——只留一个入口、所有内容都收束其中,再配合作用域隔离机制防止意外泄漏。
只暴露一个顶层命名空间
不直接声明 function utils() {} 或 var config = {...},而是统一挂载到一个项目专属对象下:
- 例如:window.MyApp = MyApp || {},后续所有功能都以 MyApp.api.request()、MyApp.storage.save() 方式组织
- 初始化时加保护:先判断是否已存在,避免覆盖已有逻辑
- 支持嵌套创建:MyApp.ui = MyApp.ui || {},再定义 MyApp.ui.modal
用 IIFE 封装模块实现私有作用域
每个脚本文件用立即执行函数包裹,让内部变量天然隔离:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 写法示例:(function() { let temp = 'hidden'; console.log(temp); })();
- 函数内用 let/const 声明的变量不会泄漏,var 也不会提升到全局
- 如需对外暴露,只把必要接口赋值给命名空间对象,比如 MyApp.init = function() {...}
优先采用 ES Module 模块系统
现代项目应默认使用 import/export,它从语言层面杜绝隐式全局:
- 每个 .js 文件自带模块作用域,顶层 const a = 1 不会变成 window.a
- 导入时可重命名:import { render as uiRender } from './ui.js',避免同名函数冲突
- 整体导入:import * as Data from './data.js',调用 Data.fetch(),结构清晰且可控
动态代码执行也要守住边界
若需运行字符串形式的代码(如配置驱动逻辑),绝不碰 eval:
- 改用 Function 构造函数,它在独立词法环境中执行,无法访问外层变量
- 所有参数显式传入,变量声明局限在函数体内,比如 new Function('x', 'y', 'return x + y')
- 对动态内容做白名单校验,禁止拼接用户输入,只允许预审通过的表达式或模板
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










