今天看ydkjs時,明白了乙個以前一直疑惑的東西,那就是js中的模組開發,之前也使用過require.s進行模組化的開發,但是一直不能明白其中具體的原理,看了ydkjs的講解後,真的是豁然開朗,在此記錄其中乙個例項的**,並進行解析。
var mymodules = (function foo();
function get(name)
function define(name, deps, impl)
} return
})();
mymodules.define('foo',,function()
return
});mymodules.define('test',['foo'],function(foo)
return
}) mymodules.get('test').usehello('hello world');
說明:
iffe
在整個mymodules
定義的最外層,使用了立即執行函式表示式var mymodules =(function foo())()
,這樣做的目的是為了形成乙個閉包,使用mymodules
儲存函式表示式function foo()
其中的詞法作用域。
暴露公共介面
使用return
,是為了將公共的介面get
和define
暴露出來,可以在mymodules
上呼叫這些方法。同時因為這兩個方法的內部都使用了變數modules
,所以modules
就會在記憶體中被儲存起來,類似於mymodules
的私有變數。
私有變數modules
變數modules
類似於mymodules
的私有變數,不通過mymodules
是無法訪問到這個變數的,且其會一直儲存在記憶體中。使用這個變數,結合define
方法,將所有定義的模組都掛載到modules
上。
模組定義的方法
function define(name, deps, impl)
}
name
: 定義的模組名稱
deps
: 模組對應的依賴
impl
: 模組的實現
模組定義的實現
我們來看看具體的模組定義和實現
mymodules.define('foo',,function()
return
});
我們定義了foo
模組,在foo
模組中,我們暴露了hello
方法,實際上此時mymodules
內部的modules
是這樣的
modules =
}
可以看到modules
上掛載的foo
模組實際上是foo
模組定義時的返回值,但是這個返回值中引用的方法hello
此時會一直儲存在記憶體中。
模組間呼叫
mymodules.define('test',['foo'],function(foo)
return
}) mymodules.get('test').usehello('hello world');
我們在模組test
中呼叫了foo
模組。注意,在test模組的實現中,我們加入了引數foo
, 那麼實際定義的過程如下
等價於所以,我們在test
模組的實現中,可以直接使用變數foo
,就像真的在呼叫foo
模組一樣,然後後我們再將test
模組中的返回值掛載到modules
上
以上是我個人對於js中的模組化的理解,如有錯誤,歡迎各位老鐵指正。
參考資料:
[1]: %26 closures/ch5.md
js 模組化補充
補充 除了第一種的套路,還可以這樣使用第二種。都是用來自執行函式的。第二種的好處是,還可以返回乙個true。常用 function 小技巧 如果不加上!會報錯,加上之後還能返回true呢。但由於衡返回true。所以只有某些函式是只執行,不在於返回結果的可以用這種。function 相容套路1 適用於...
js模組化規範
標記已經載入成功的個數 var req total 0 模組匯出 window.exports 記錄各個模組的順序 var exp arr 判斷是否陣列 function isarray param require 真正實現 function require arr,callback else va...
理解JS 模組化
module.exports與exports,export與export default之間的關係和區別 js 模組化規範 最早是閉包的寫法,防止變數的汙染 多個js 用 defer 和 async amd 和 cmd 在es6 module 出現之後就退出歷史的舞台了 es6 module 瀏覽器...