命名空间模式是无打包工具时最直接兼容的前端模块化方式,通过唯一全局对象(如app)挂载子模块、分层嵌套、iife封装私有逻辑,并依赖显式加载顺序。

在没有打包工具(如 Webpack、Vite)的情况下,命名空间模式是组织前端 JavaScript 代码最直接、兼容性最强的模块化方式。它不依赖构建流程,纯浏览器运行,适合小型项目、遗留系统维护或快速原型开发。
用唯一全局对象做“总入口”
核心是只暴露一个全局变量(比如 App 或 MyProject),所有功能都挂载其下,避免污染全局作用域。
- 先判断是否已存在,防止重复定义:
var App = App || {}; - 后续所有模块都基于这个对象扩展,例如:
App.user = { login() {}, logout() {} }; - 页面中只需引入多个
<script></script>文件,只要顺序合理(先定义 App,再挂载子模块),就能自然协作
分层创建嵌套命名空间
按业务或功能划分层级,让结构清晰、便于定位。比如用户相关放 App.user,工具方法放 App.util,API 请求放 App.api。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 手动创建多级对象:
App.api = App.api || {};→App.api.auth = { login() {}, refreshToken() {} }; - 推荐封装一个通用函数,避免重复判断:
const parts = path.split('.');
let obj = window;
for (const part of parts) {
if (!obj[part]) obj[part] = {};
obj = obj[part];
}
return obj;
}
// 使用:ns('App.ui.dialog').show = function() { ... };
配合立即执行函数(IIFE)封装私有逻辑
命名空间本身不提供私有性,但可以和 IIFE 结合,在模块内部隐藏实现细节,只暴露接口。
- 例如用户模块可这样写:
let _token = '';
function setToken(t) { _token = t; }
return {
login: function(username, pwd) { /* 调用 setToken */ },
isLogin: function() { return !!_token; }
};
})();
- 外部只能调用
App.user.login()和App.user.isLogin(),无法访问_token或setToken
保持加载顺序与依赖显式化
没有打包工具,脚本加载顺序决定执行逻辑。需人工管理依赖关系。
- 基础命名空间定义(如
var App = App || {};)必须最先加载 - 子模块按依赖顺序排列:比如
util.js要早于user.js(因 user 可能用到 util 中的方法) - 可在模块顶部加注释说明依赖,例如:
// @require App.util,作为团队约定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










