一、原始写法
模块就是实现特定功能的一组方法。
只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块。
1 2 3 4 5 6 | function m1(){ //... } function m2(){ //... } |
上面的函数m1()和m2(),组成一个模块。使用的时候,直接调用就行了。
这种做法的缺点很明显:"污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系。
二、对象写法
为了解决上面的缺点,可以把模块写成一个对象,所有的模块成员都放到这个对象里面。
1 2 3 4 5 6 7 8 9 | var module1 = new Object({ _count : 0, m1 : function (){ //... }, m2 : function (){ //... } }); |
上面的函数m1()和m2(),都封装在module1对象里。使用的时候,就是调用这个对象的属性。
但是,这样的写法会暴露所有模块成员,内部状态可以被外部改写。比如,外部代码可以直接改变内部计数器的值。
三、立即执行函数写法
使用""(Immediately-Invoked Function Expression,IIFE),可以达到不暴露私有成员的目的。
1 2 3 4 5 6 7 8 9 10 11 12 13 | var module1 = (function(){ var _count = 0; var m1 = function(){ //... }; var m2 = function(){ //... }; return { m1 : m1, m2 : m2 }; })(); |
使用上面的写法,外部代码无法读取内部的_count变量。
1 | console.info(module1._count); //undefined |
module1就是Javascript模块的基本写法。
本文来自:http://www.cnblogs.com/tjyoung/p/5569940.html