閱讀我的原文
function publishExternalAPI(angular){}
publishExternalAPI就是將一些通用的方法掛載到全局變量angular上,然后我們就可以以API的形式進行調用
函數首先傳入一個angular的全局變量,下面將會遇到在前面定義的好的一個extend函數
function extend(dst) {
var h = dst.$$hashKey;
return forEach(arguments, function(obj) {
obj !== dst && forEach(obj, function(value, key) {
dst[key] = value
})
}), setHashKey(dst, h), dst
}
這里的方法就是將某些通用的方法掛到一個對象上面,extend傳入和返回都是dst形參對象,里面經歷了兩個forEach,forEach也是angular前面定義好的函數,extend根據傳入的arguments個數進行判斷,dst是需要掛載的對象,arguments中除了dst外都是需要被掛載到dst中的對象
obj !== dst && forEach(obj, function(value, key) {})
上面這句就是將arguments中的dst對象排除出去,然后對dst進行對象掛載
然后就轉化成
angular['boostrap'] = boostrap;
angular['copy'] = copy;
angular['extend'] = extend;
//...省略若干個通用的方法
上面就不一一列出所有方法,當然當我們對加載了angular.js的頁面進入控制臺進行打印就會很清晰的看出這里的全部方法
console.log(angular);
如圖所示

這些通用的工具函數在實際的項目中會經常使用到,挺方便的例如forEach,toJson和fromJson這些常用函數
當然就如上面的extend也可以是做API調用,也寫個簡單的例子,同樣在控制器里面輸入一段代碼,然后打印,這里創建一個空對象,并把該對象后面的對象拷貝并掛載到該空對象中,并賦值給wscat,那么wscat對象就有對應的這些屬性
var wscat = angular.extend({}, {name:"autumnswind",skill:"none"})
console.log(wscat)

咱們繼續往下看
angularModule = setupModuleLoader(window)
這里為angular對象創建和加載module()函數,這里我在Angular源碼解讀setupModuleLoader函數有詳細的分析,這里就不多說了,有需要的的可以回頭看一下
繼續下面這句
try {
angularModule("ngLocale")
} catch (e) {
angularModule("ngLocale", []).provider("$locale", $LocaleProvider)
}
try代碼塊里面首先判斷是否獲取到獲取ngLocale模塊,如果我們獲取不到,則就報個異常(ngLocale默認沒有創建的)
catch代碼塊接受上面的異常(也就是獲取不到ngLocale模塊走catch分支),然后在這個位置注冊ngLocale模塊
簡單的說這里angular.module在創建模塊的時候,傳遞一個參數的時候,是獲取模塊;傳遞一個以上的是創建新模塊;所以try里面是獲取,catch里面就是創建了
那么這里就成功的創建了一個ngLocale模塊,其實angularModule實際上就是angular.module
angularModule = angular.module
angularModule("ngLocale", []) = angular.module("ngLocale", [])
所以我們就可以鏈式去調用對象moduleInstance中的directive和provider