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之前有初始化)。完毕。

  • 相关阅读:
    Json对象处理.将对象处理成dic数组.
    asp.net core 创建允许跨域请求的api, cors.
    (转载)dotnet core 中文乱码 codepages
    (转载)Memcached和Redis简介
    发送Json数据,WebApi查看时为Null的问题(已解决)
    Vs2017获取Git空仓库后创建解决方案及项目无法推送,推送失败的问题.
    前端:Jquery 处理同一Name的Radio组时,绑定checked属性异常的问题.(已解决)
    Vs2015 本地git获取的代码目录文件修改后,启动提示error:Unable to start program “C:Program Filesdotnetdotnet.exe” 已解决.
    .net core 发布后提示Start error
    .net core vs2015 vs2017打开后errpr
  • 原文地址:https://www.cnblogs.com/huaziWEB/p/4999437.html
Copyright © 2011-2022 走看看