fekit 以及 exports 和 module.exports

give you code
;(function(__context){
var module = {
    id : "d190afa81b7855f183995c7cb81f729c" ,
    filename : "index.js" ,
    exports : {}
};
if( !__context.____MODULES ) { __context.____MODULES = {}; }
var r = (function( exports , module , global ){
    ;(function(__context) { ********************************************
        var module = {
            id: "d56a755fdfbfbb97c55d371d9dd8b449",    //惟一索引  文件內容計算出來的MD5
            filename: "helloFekit.js",   //標識文件
            exports: {}                  //文件暴漏出來的API集合
        };
        //申明window下的一個屬性,未來保存此文件的API
        if (!__context.____MODULES) {   __context.____MODULES = {}; }     

        var r = (function(exports, module, global) {
                    exports = function fekit(argument) {
                        alert("hello fekit");
                    }
                })(module.exports, module, __context);
        
        __context.____MODULES["d56a755fdfbfbb97c55d371d9dd8b449"] = module.exports;
       })(this);   ********************************************************
        var fekit = __context.____MODULES['d56a755fdfbfbb97c55d371d9dd8b449'];
           fekit();
   })( module.exports , module , __context );
   __context.____MODULES[ "d190afa81b7855f183995c7cb81f729c" ] = module.exports;
})(this);

這段代碼是從fekit編譯以後的js文件中爬出來的。乍一看有種嚇尿的感受。文件結構大體是這樣的,一個入口文件名稱是index.js。在index.js裏什麼都沒幹,引入了helloFekit文件。 以後就被編譯成這個鬼樣子了。閉包

可是不難看出,事實上被我用*號標記出來的代碼塊就是在index.js中被引用的helloFekit文件。並且有趣的是 外層的index.js編譯結果與內部的文件代碼驚人的類似。因此能夠獲得一個結論: 遵循fekit require規範的的文件實際上都被包裹上了一個閉包。被引用的文件自動包裹到引用文件的內部。由此推論,深層引用不是一個好的注意。函數

好吧,既然跑題了就索性跑丟吧!
從代碼上來看,一個模塊(js文件)內部暴漏出來的對象事實上是放到了window.____MODULES的一個屬性上,這個屬性key是這個模塊的md5值,固然是加鹽了的。外部和內部的模塊通訊其實是經過掛到window.____MODULES上來實現的。ui

module.exports exports

言歸正傳。
注意代碼中的 var r = (fun)();
事實上模塊中的代碼都被放到了此處來執行,並且傳參頗有意思,傳遞了一個module.exports還傳遞了一個module,js函數參數傳遞都是傳值的,只不過參數是對象類型的時候穿的是引用地址罷了。那麼就意思是,exports事實上只是module.exports的一個引用,換句說這兩個對象指向同一個堆內存。因此當你使用exports.name時事實上擴充了此空間,可是當你使用exports = {...}時候,實際上你是修改了exports的指向,故這樣作在外部給window.....賦值的時候會賦值爲空Object(由於module.exports以前有初始化)。完畢。this

相關文章
相關標籤/搜索