Js 模块化(一)
---恢复内容开始---
基础模式
匿名闭包
匿名闭包是很常用的代码隔离方式,声明匿名对象并立即执行。匿名函数中声明的变量和方法以及匿名函数本身不会污染到函数体外,同时匿名函数的调用形成一个闭包,使函数体内可以使用函数体外声明的变量和方法。
(function () {
// ... all vars and functions are in this scope only
// still maintains access to all globals
}());
全局导入
我们知道 JavaScript 全局变量的作用域贯穿全局,在函数内也可以使用甚至声明全局变量,这样很容易导致代码混乱难以管理。
全局导入模式是匿名闭包的一个变种,增加参数导入全局变量,约定在匿名函数内部只能通过导入的参数访问外部的模块,从而使模块间的依赖清晰,便于管理。
(function ($, YAHOO) {
// now have access to globals jQuery (as $) and YAHOO in this code
}(jQuery, YAHOO));
这种约定不能强制阻止函数体内部访问全局变量,其中一个解决方案是把所有的模块都使用这种方式处理,仅把模块本身导出到全局变量,这样就可以极大减少全局变量的使用。
模块导出
模块导出就是将立即执匿名函数的结果返回赋值给一个全局变量。匿名函数仅将开放的对象返回,其内部定义的变量、函数仍然对外部不可见。
var MODULE = (function () {
var my = {},
privateVariable = 1;
function privateMethod() {
// ...
}
my.moduleProperty = 1;
my.moduleMethod = function () {
// ...
};
return my;
}());
进阶模式
扩充模式
JavaScript 对象支持热扩充,结合全局导入模式,我们可以将模块进行扩充。
var MODULE = (function (my) {
my.anotherMethod = function () {
// added method...
};
return my;
}(MODULE));
这种模式假定 MODULE 已经声明过,如果没有声明调用会出错。
---恢复内容结束---