angular之moduler与服务等api生成。(angualr版本是1.2.28)
function setupModuleLoader(window) { //得到 注入器异常与ng异常 var $injectorMinErr = minErr('$injector'); var ngMinErr = minErr('ng'); //方法属性绑定 function ensure(obj, name, factory) { return obj[name] || (obj[name] = factory()); } //绑定angular,到window上。 var angular = ensure(window, 'angular', Object); //把minerr绑定到 angluar上 angular.$$minErr = angular.$$minErr || minErr; //绑定 module方法到 angualr上,,,当你使用angular.module()的时候,实际上调用了 下面的 module方法 return ensure(angular, 'module', function() { var modules = {}; //模块名,依赖关系, configFn,其实就等于 angular.module().config(); return function module(name, requires, configFn) { var assertNotHasOwnProperty = function(name, context) { if (name === 'hasOwnProperty') { throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context); } }; //排除hasOwnProperty, assertNotHasOwnProperty(name, 'module'); if (requires && modules.hasOwnProperty(name)) { modules[name] = null; } return ensure(modules, name, function() { if (!requires) { throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " + "the module name or forgot to load it. If registering a module ensure that you " + "specify the dependencies as the second argument.", name); } //这个数组保存 除 run之外所有 方法的操作 /** @type {!Array.<Array.<*>>} */ var invokeQueue = []; //保存 run方法的执行 /** @type {!Array.<Function>} */ var runBlocks = []; //提前实例化 config方法 var config = invokeLater('$injector', 'invoke'); /** @type {angular.Module} */ var moduleInstance = { // Private state _invokeQueue: invokeQueue, _runBlocks: runBlocks, requires: requires, name: name, provider: invokeLater('$provide', 'provider'), service: invokeLater('$provide', 'service'), animation: invokeLater('$animateProvider', 'register'), config: config, run: function(block) { runBlocks.push(block); return this; } }; if (configFn) { config(configFn); } //执行完module 方法,返回的是这个对象 return moduleInstance; //这个方法很关键,provider的名字,初始化方法。 function invokeLater(provider, method, insertMethod) { //基本每个 方法 实际执行的这个 方法。 return function() { invokeQueue[insertMethod || 'push']([provider, method, arguments]); return moduleInstance; }; } }); }; }); }