默认情况下,所有变量(因此也包括函数声明)都存在于全局命名空间中。
在JavaScript中引入一个单独的命名空间的唯一方法是通过函数调用。以下是如何实现:
(function () {
}());
你可以将你的代码用匿名函数包裹起来,并立即调用它。这样,即使有相同名称的函数,它们也是独立的。
例子
比如说,如果你有以下代码:
var my, local, data;
function initData() {
}
如果你有其他地方:
var some, other, data;
function initData() {
}
那么一个initData
将覆盖另一个initData
。但是,如果你将它们分别包装在自己的(function () {}());
中,那么它们将是独立的。
(function () {
var my, local, data;
function initData() {
}
}());
(function () {
var some, other, data;
function initData() {
}
}());
请注意,这些名称不再在全局命名空间中,因此它们在匿名函数之外也无法使用。
一个全局对象
为了控制在全局命名空间中暴露多少和什么内容,通常会通过一个全局对象来公开所需内容,通常使用所有大写字母。
FOO.module1.initData();
FOO.module2.initData();
你需要确保FOO存在,如果不存在,则创建它。
var FOO = this.FOO || {};
对于您的模块命名空间也适用相同规则:
FOO.module1 = FOO.module1 || {};
然后在匿名函数内部,暴露你想要的内容。
完整示例
module1.js:
var FOO = this.FOO || {};
FOO.module1 = FOO.module1 || {};
(function () {
var my, local, data;
function initData() {
}
FOO.module1.initData = initData;
}());
module2.js:
var FOO = this.FOO || {};
FOO.module2 = FOO.module2 || {};
(function () {
var some, other, data;
function initData() {
}
FOO.module2.initData = initData;
}());
控制器.js:
FOO.module1.initData();
FOO.module2.initData();
一个最后的提示
如上所述,该控制器依赖于 module1.js
和 module2.js
,需要在最后加载。可以使用类似 jQuery
的 document.ready
来避免这种情况,使其等待所有脚本加载。
jQuery(document).ready(function () {
FOO.module1.initData();
FOO.module2.initData();
});
如果你还没有使用jQuery,你可以使用一个小型脚本domReady来避免臃肿。