需要模块管理的原因就是JavaScript发展的越来越快,超过了它产生时候的自我定位。由于没有模块管理的概念,在做大型项目或者文件组织的时候,就会异常纠结。所以才会产生出这么多的模块管理工具。模块化的主要特征是:
- 模块化,可重用
- 封装了变量和function,和全局的namaspace不接触,松耦合
- 只暴露可用public的方法,其它私有方法全部隐藏
实现方式
初级阶段,代码中充斥的是各种函数,通过名称区分:
function func1() {}
function func2() {}
实际上这些函数都被挂载到了全局变量下,使用的时候可以直接调用,缺点就是: "污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系。
对象写法
解决上述污染问题,可以把模块写成一个对象,所有的模块成员都放到这个对象里面。
var module1 = new Object({
_count: 0,
m1: function() {
//...
},
m2: function() {
//...
}
});
// 等价于
var module2 = {
_count: 0,
m1: function() {
//...
},
m2: function() {
//...
}
}
外部可以通过定义的变量名访问,起到了一点点的命名空间作用,但是同样缺点明显: 会暴露所有模块成员,内部状态可以被外部改写。比如,外部代码可以直接改变内_count的值。
立刻执行函数(Immediately-Invoked Function Expression,IIFE) or 匿名闭包
如果你不需要传参数或者没有一些特殊苛刻的要求的,可以使用立刻执行函数,该实例在内存中只会存在一份copy。
var module1 = (function() {
var _count = 0;
var m1 = function() { //...
};
var m2 = function() { //...
};
return {
m1: m1,
m2: m2
};
})();
这样可以很好的保护私有变量,通过return来设置公开的方法。缺点也有: 动态添加方法的时候比较麻烦,且无法修改内部私有变量 .
未完...