zoukankan      html  css  js  c++  java
  • 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上来实现的。

    module.exports exports

    言归正传。
    注意代码中的 var r = (fun)();
    事实上模块中的代码都被放到了此处来执行,而且传参很有意思,传递了一个module.exports还传递了一个module,js函数参数传递都是传值的,只不过参数是对象类型的时候穿的是引用地址罢了。那么就意思是,exports事实上只是module.exports的一个引用,换句说这两个对象指向同一个堆内存。所以当你使用exports.name时事实上扩充了此空间,但是当你使用exports = {...}时候,实际上你是修改了exports的指向,故这样做在外部给window.....赋值的时候会赋值为空Object(因为module.exports之前有初始化)。完毕。

  • 相关阅读:
    C# 委托/Func() 中 GetInvocationList() 方法的使用 | 接收委托多个返回值
    蒋廷黻著《中国近代史》-中国近代屈辱史读后感
    ASP.NET Core 上传多文件 超简单教程
    Python
    Python
    Python
    Python
    Python
    Python
    Python
  • 原文地址:https://www.cnblogs.com/huaziWEB/p/4999437.html
Copyright © 2011-2022 走看看