模块化其实就是实现特定功能的一组方法
一、原始写法
function test1(){ // }; function test2(){ // }; 缺点:"污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系 二、对象写法(将test1()和test2()都封装在module1对象里) var module1=new Object({ _count:0; test1:function(){ // }, test2:function(){ // } }); //调用 module1.test1()缺点:暴露所有模块成员,内部状态可以被外部改写。比如外部代码可以直接改变内部计数器的值:module1._count=5 三、立即执行函数写法(不暴露私有成员,外部代码无法读取内部的变量) var module1=(function(){ var _count=0; var test1=function(){ // }; var test2=function(){ // }; return{ test1:test1, test2:test2 }; })();这种写法是JS模块的基本写法。在这个的基础上可以对他进行加工四、放大模式(模块很大可以分成几个部分)
var module1 = (function (mod){ mod.test3= function () { //... }; return mod; })(module1);五、宽放大模式(在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。如果采用上一节的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用"宽放大模式"。)var module1 = ( function (mod){ //... return mod; })(window.module1 || {}); 六、输入全局变量(独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。为了在模块内部调用全局变量,必须显式地将其他变量输入模块)
var module1 = (function ($, YAHOO) { // })(jQuery, YAHOO);上面的module1模块需要使用jQuery库和YUI库,就把这两个库(其实是两个模块)当作参数输入module1。这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显(目前不懂)