這本書真的挺不錯的,感覺以前很多不敢碰,很迷茫的問題都解決好多,看到模塊化記錄一下自己的理解
下面是代碼:
var MyModules = (function Manager() {
var modules = {};
function define(name, deps, impl) {
for (var i=0; i<deps.length; i++) {
deps[i] = modules[deps[i]];
}
modules[name] = impl.apply( impl, deps );
}
function get(name) {
return modules[name];
}
作用域閉包 | 55
return {
define: define,
get: get
};
})();
這段代碼的核心是 modules[name] = impl.apply(impl, deps)。爲了模塊的定義引入了包裝
函數(可以傳入任何依賴),並且將返回值,也就是模塊的 API,儲存在一個根據名字來管
理的模塊列表中。
下面展示瞭如何使用它來定義模塊:
MyModules.define( "bar", [], function() {
function hello(who) {
return "Let me introduce: " + who;
}
return {
hello: hello
};
} );
MyModules.define( "foo", ["bar"], function(bar) {
var hungry = "hippo";
function awesome() {
console.log( bar.hello( hungry ).toUpperCase() );
}
return {
awesome: awesome
};
} );
var bar = MyModules.get( "bar" );
var foo = MyModules.get( "foo" );
console.log(
bar.hello( "hippo" )
); // Let me introduce: hippo
foo.awesome(); // LET ME INTRODUCE: HIPPO
代碼有點亂,手動縮進一波,看起來還好主要代碼
modules[name] = impl.apply( impl, deps );//意思就是改變參數執行impl這個函數
for (var i=0; i<deps.length; i++) {
deps[i] = modules[deps[i]];
}//這個循環單獨看簡直一臉懵逼,得結合下面的代碼看,並且其中有執行順序先執行MyModules.define( "bar", [], function() {})函數後執行MyModules.define( "foo", ["bar"], function(bar) {}),當執行第二個函數時對象中modules已經存在一個key爲bar的函數,所以第二個函數才能夠順利的執行。
整體代碼理解一下應該沒問題,因爲是第一次向js源碼發起挑戰,記錄一下。特別不喜歡那種看不懂源碼的感覺,用什麼插件出錯了總要弄半天,不知道從何下手的感覺特別難受。