module的原理是利用必包实现。来看下面的代码:

function coolModule(){
	var someThing  =  'cool';
	var anther = [1,2,3];

	function doSomeThing(){
		console.log(someThing);
	}
	function doAnther(){
		console.log(anther.join('!'));
	}
	return {
		doSomeThing : doSomeThing,
		doAnther : doAnther
	}
}

var foo = coolModule();
foo.doSomeThing();
foo.doAnther();

可以看到coolModule函数有两个私有函数doSomeThing和doAnther,通过返回字面量{key:value…}形式,将私有函数doSomeThing和doAnther,对外提供为两个API。然后通过执行实力化coolModule并将返回值赋值给foo,使foo通过API可以调用doSomeThing和doAnther;可见module模式有两个特点:

  1. 外部需要有个封闭函数,必需被调用一次(通过调用被实力);
  2. 封闭函数需要至少要返回一个内部函数,这样才能形成作用域和必包, 才能访问和修改内部私有属性;

module模式一个重要的用法是,可以命名将要作为API的对象。可以对内部module进行修改,对内部属性进行增删改查操作:

var foo = function coolModule(api){
	function change(){
		publicAPI.identify1 = identity2;
	}
	function identify1(){
		console.log(api);
	}
	function identity2(){
		console.log(api.toUpperCase());
	}
	var publicAPI = {
		change  : change,
		identify1 : identify1,
		identity2 : identity2
	}
	return publicAPI;
}('api document');
foo.identify1();
foo.change();
foo.identify1();