解析angular模块的创建过程
从立即调用函数把angular注册到window
在执行setupModule函数中把window对象传入函数内部,通过ensure函数把angular注册到window对象上
接着在注册一个module属性到angular对象上,属性值指向闭包函数module,
当执行angular.module()方法时,把自定义的模块名注册在闭包环境中的modules={}上,同时返回绑定了一序列方法(factory,controller)的moduleInstance对象返回到外部
(function(window) {
function setupModule(window) {
function ensure(obj, name, factory) {
return obj[name] || (obj[name] = factory());
}
//把angular注册到window上
var angular = ensure(window, 'angular', Object);
//把module注册都angular上,并返回angular['module']方法
return ensure(angular, 'module', function() {
var modules = {};
//angular.module()调用时执行的方法
return function module(name, requires, configFn) {
//执行这个方法后,返回的模块实例
return ensure(modules, name, function() {
//返回的模块实例
var moduleInstance = {
controller: function() {
console.log("I am controller");
},
factory: function() {
console.log("I am factory");
},
service: function() {
console.log("I am service");
}
};
return moduleInstance;
});
}
});
}
setupModule(window);
})(window);
//创建一个模块mymodule,并把moduleInstance返回给mymodule变量
var mymodule = angular.module('mymodule', []);
//执行controller方法
mymodule.controller(); //I am controller