JavaScript模块化核心是作用域隔离:IIFE创建私有作用域、块级作用域缩小变量泄漏范围、命名空间对象轻量封装、ES模块为现代标准解法。

核心是把变量和函数关进“私有房间”,不让它们跑到全局作用域里乱撞。JavaScript 本身没有模块化时,靠函数作用域就能天然实现这种隔离。
用立即执行函数(IIFE)建私有作用域
这是最直接、兼容性最好的方式。函数内部定义的 var、let、const 和函数,外部完全访问不到:
- 标准写法:
(function() { let count = 0; function increment() { count++; } })();——count和increment不会出现在window上 - 想用全局对象?可以传参进去:
(function(global) { global.myPlugin = { init() {} }; })(window);—— 只暴露你明确挂载的接口 - 多个脚本都用 IIFE,彼此互不干扰,哪怕都叫
init或utils,也各自安好
用块级作用域(let/const)缩小泄漏范围
ES6 的 块级作用域 虽不能替代模块,但在局部场景下很有效:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 避免在
if、for或独立代码块中用var声明变量,改用let或const - 例如:
{ const temp = 'cache'; console.log(temp); } console.log(temp); // 报错—— 大大降低意外挂到全局的风险 - 配合 IIFE 使用,能进一步收紧作用域边界
用命名空间对象做轻量级封装
适合简单插件或老项目渐进改造,比全放全局干净,又比 IIFE 更易调试:
立即学习“Java免费学习笔记(深入)”;
- 只声明一个全局对象,其余都挂它下面:
window.myApp = { version: '1.0', utils: { formatDate() {} }, api: { fetchUser() {} } }; - 关键点:提前检查是否存在,避免覆盖:
if (!window.myApp) window.myApp = {}; - 缺点是仍依赖人工约定,一旦有人绕过对象直接声明
var helper = ...,就前功尽弃
升级到模块系统是长期解法
IIFE 是过渡手段,现代项目应优先使用原生模块机制:
-
ES 模块(.mjs 或 type="module"):每个文件自带顶级作用域,
import/export明确边界,变量默认不暴露 -
CommonJS(Node.js 环境):通过
module.exports控制输出,require加载即创建新模块作用域 - 打包工具(如 Vite、Webpack)会自动将非模块脚本包裹成 IIFE,帮你兜底

















