window
对象是浏览器中的全局对象,代表当前窗口或标签页。它包含所有全局变量和函数,并提供与浏览器交互的各种方法。
// 示例:命名冲突导致的问题
window.utils = { version: '1.0' };
// 其他脚本中也定义了同名的utils
window.utils = { version: '2.0' }; // 覆盖之前的定义
utils
)导致功能异常。function bindLargeData() {
const largeData = new Array(1000000).fill('data');
window.cachedData = largeData;
}
// 如果不及时清理,largeData将一直占用内存
window.userToken = 'abc123xyz'; // 敏感信息暴露在全局
for (let i = 0; i < 10000; i++) {
window[`tempData${i}`] = `value-${i}`;
}
window
对象上。window.myModule = {
init: function () {
console.log('模块初始化');
}
};
// 在多个文件中重复定义myModule会破坏封装性
window
对象,缺乏封装。$(document).ready(function () {
window.myJQueryPlugin = {
doSomething: function () {}
};
});
window
暴露API,容易与其他插件冲突。$.fn
上而不是window
。new Vue({
mounted() {
window.vueInstance = this; // 不推荐
}
});
window.vueInstance
破坏封装。const App = () => {
useEffect(() => {
window.reactComponentRef = { updateData: () => {} };
}, []);
return <div>App</div>;
};
window
会导致副作用难以管理。useEffect
中挂载全局变量。@Injectable({ providedIn: 'root' })
class MyService {
constructor() {
window.angularService = this; // 不推荐
}
}
@Output()
或EventEmitter
进行跨组件通信。(function (global) {
const MY_APP = {
version: '1.0',
utils: {
formatTime: function (time) {}
}
};
global.MY_APP = MY_APP;
})(window);
const myModule = (function () {
let privateVar = 'secret';
function privateMethod() {
console.log(privateVar);
}
return {
publicMethod: function () {
privateMethod();
}
};
})();
// utils.js
export const formatTime = (time) => {};
// main.js
import { formatTime } from './utils.js';
window.tempData = { data: 'temporary' };
// 使用后及时删除
delete window.tempData;
开始
│
├─ 是否需要全局访问?
│ ├─ 是 → 是否已有命名空间?
│ │ ├─ 是 → 绑定到现有命名空间
│ │ └─ 否 → 创建唯一命名空间并绑定
│ └─ 否 → 使用模块/闭包封装
│
├─ 是否为敏感信息?
│ ├─ 是 → 加密处理或使用安全存储(如localStorage)
│ └─ 否 → 正常绑定
│
├─ 是否为临时数据?
│ ├─ 是 → 使用局部变量或weakMap
│ └─ 否 → 使用状态管理工具
│
└─ 结束
方案 | 优点 | 缺点 | 推荐指数 |
---|---|---|---|
命名空间 | 简单易用 | 仍可能冲突 | ⭐⭐⭐ |
IIFE模块 | 封装性强 | 手动管理复杂 | ⭐⭐⭐⭐ |
ES6模块 | 标准化 | 需要打包工具 | ⭐⭐⭐⭐⭐ |
状态管理库 | 可维护性强 | 学习成本高 | ⭐⭐⭐⭐⭐ |
老曹建议:
window
,请使用唯一命名空间。