1.无依赖情况

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>一步步走入AMD</title><script>var req = {};/*无依赖*/req.config = {"a":{deps:[],fn:function(){console.log("a");}},"b":{deps:[],fn:function(){console.log("b");}},"c":{deps:[],fn:function(){console.log("c");}},}var require = function(deps,fn){var config = req.config,deps_arr = [];// 1.找依赖,生成依赖数组for(var i=0,l = deps.length; i<l; i++){var deps_item = deps[i];deps_arr.push(config[deps_item].fn);}// 2.依赖数组,是入口函数的参数
        fn.apply(window,deps_arr);};require(["a","b"],function(a,b){a();b();});</script>
</head>
<body></body>
</html>

2.有依赖

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>不要温柔地走入AMD</title><script>    var req = {};/*有依赖*/req.config = {"a":{deps:["b"],fn:function(b){return function(){console.log("a");b();}}},"b":{deps:["c"],fn:function(c){return function(){console.log("b");c();}}},"c":{deps:[],fn:function(){var private_c = "cc"return function(){console.log("c");console.log(private_c);}}}}var require = function(deps,fn){var config = req.config,deps_arr = [];var excute_obj = {},deps_chain = [];for(var i in config){deps_chain.push(i);}// 包装各个依赖函数
        deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],item_fn = function(){return item["fn"].apply(window,excute_obj[configName]["deps"])();};excute_obj[configName] = {};excute_obj[configName]["fn"] = item_fn;});// 依赖函数的执行参数生成
        deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],param_arr = [];item_deps.forEach(function(i){param_arr.push(excute_obj[i]["fn"]);});excute_obj[configName]["deps"] = param_arr;});console.log(excute_obj);deps.forEach(function(configName){deps_arr.push(excute_obj[configName]["fn"]);});fn.apply(window,deps_arr);};// bug:依赖设置错误
    require(["a"],function(a){a();});</script>
</head>
<body></body>
</html>

3.循环依赖判断

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>不要温柔地走入AMD</title><script>    var req = {};/*有循环依赖*/req.config = {"a":{deps:["b","c"],fn:function(b,c){return function(){console.log("a");b();c();}}},"b":{deps:["c"],fn:function(c){return function(){console.log("b");c();}}},"c":{deps:["a"],fn:function(){return function(){console.log("c");}}}}var require = function(deps,fn){var config = req.config,deps_arr = [];var excute_obj = {},deps_chain = [];for(var i in config){deps_chain.push(i);}console.log(deps_chain);function arrayClone(arr){var _array = [];for(var i=0,l=arr.length; i<l; i++){_array.push(arr[i]);}return _array;}function loopDepJudge(currentKey,currentDeps, circleArr){var check_arr = [];check_arr.unshift(arrayClone(currentDeps) );var keyChain = [currentKey];// 开始循环
            (function(){var currentDeps = check_arr[0];// console.log(currentDeps);if(currentDeps.length > 0){var nextKey = currentDeps.shift(),nextDeps = circleArr[nextKey];if(keyChain.indexOf(nextKey) > -1){        keyChain = [false,nextKey,keyChain.pop()];return;}else{keyChain.push(nextKey);}if(nextDeps.length > 0){check_arr.unshift(arrayClone(nextDeps));}else{check_arr.shift();keyChain = [currentKey];if(check_arr.length == 0){return;}}}else{return;}arguments.callee();})();return keyChain;}(function(){// 循环依赖检测var circle_deps = {};deps_chain.forEach(function(configName){circle_deps[configName] = config[configName]["deps"];});deps_chain.forEach(function(configName){var key = configName,deps = arrayClone(circle_deps[key]);var keyChain = loopDepJudge(key,deps,circle_deps);if(keyChain[0] == false){throw new Error("有循环依赖。他们是"+keyChain[1]+"和" +keyChain[2]);}else{console.log(keyChain)}});// var keyChain = loopDepJudge()// 包装各个依赖函数
            deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],item_fn = function(){return item["fn"].apply(window,excute_obj[configName]["deps"])();};excute_obj[configName] = {};excute_obj[configName]["fn"] = item_fn;});// 依赖函数的执行参数生成
            deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],param_arr = [];item_deps.forEach(function(i){param_arr.push(excute_obj[i]["fn"]);});excute_obj[configName]["deps"] = param_arr;});console.log(excute_obj);})();deps.forEach(function(configName){deps_arr.push(excute_obj[configName]["fn"]);});fn.apply(window,deps_arr);};require(["a"],function(a){a();});</script>
</head>
<body></body>
</html>

4.define函数定义

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>不要温柔地走入AMD</title><script>    var req = {};/*define函数定义*/req.requireConfig = {};var define = function(deps,fn){var protocal = location.protocal,host = location.host,port = location.port,pathName = location.pathname,href = location.href,paths = req.userConfig.paths,baseUrl = req.userConfig.baseUrl || "";function baseUrlParse(baseUrl){var str_length = baseUrl.length,newBaseUrl = "";if(baseUrl.lastIndexOf("/") == str_length -1){}else{newBaseUrl = baseUrl + "/";}return newBaseUrl;}// 不支持IE// 1.获取当前js文件地址var scriptSrc = document.currentScript.src;for (var i in paths) {var path = paths[i],complete_path = "";// 2. 生成complete_pathvar backslash_pos = href.lastIndexOf("/"),slash_href = href.substring(0,backslash_pos+1),complete_path = slash_href + baseUrlParse(baseUrl) + path;// 3. 根据文件地址进行匹配,从而生成req.requireConfigif(scriptSrc == complete_path){req.requireConfig[i] = {"deps":deps,"fn":fn};}};};var require = function(deps,fn){function arrayClone(arr){var _array = [];for(var i=0,l=arr.length; i<l; i++){_array.push(arr[i]);}return _array;}function loopDepJudge(currentKey,currentDeps, circleArr){var check_arr = [];check_arr.unshift(arrayClone(currentDeps) );var keyChain = [currentKey];// 开始循环
            (function(){var currentDeps = check_arr[0];// console.log(currentDeps);if(currentDeps.length > 0){var nextKey = currentDeps.shift(),nextDeps = circleArr[nextKey];if(keyChain.indexOf(nextKey) > -1){        keyChain = [false,nextKey,keyChain.pop()];return;}else{keyChain.push(nextKey);}if(nextDeps.length > 0){check_arr.unshift(arrayClone(nextDeps));}else{check_arr.shift();keyChain = [currentKey];if(check_arr.length == 0){return;}}}else{return;}arguments.callee();})();return keyChain;}var config = req.requireConfig,deps_arr = [],excute_obj = {},deps_chain = [];for(var i in config){deps_chain.push(i);}// 循环依赖检测
        (function(){var circle_deps = {};deps_chain.forEach(function(configName){circle_deps[configName] = config[configName]["deps"];});deps_chain.forEach(function(configName){var key = configName,deps = arrayClone(circle_deps[key]);var keyChain = loopDepJudge(key,deps,circle_deps);if(keyChain[0] == false){throw new Error("有循环依赖。他们是"+keyChain[1]+"和" +keyChain[2]);}else{console.log(keyChain)}});})();// 包装各个依赖函数
        deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],item_fn = function(){return item["fn"].apply(window,excute_obj[configName]["deps"])();};excute_obj[configName] = {};excute_obj[configName]["fn"] = item_fn;});// 依赖函数的参数数组生成
        deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],param_arr = [];item_deps.forEach(function(i){param_arr.push(excute_obj[i]["fn"]);});excute_obj[configName]["deps"] = param_arr;});// 主函数的参数数组生成
        deps.forEach(function(configName){deps_arr.push(excute_obj[configName]["fn"]);});fn.apply(window,deps_arr);};req.userConfig = {"baseUrl":"","paths":{"a":"a.js","b":"b.js","c":"c.js"}};</script><script type="text/javascript" src="b.js"></script><script type="text/javascript" src="a.js"></script><script type="text/javascript" src="c.js"></script><script>require(["a"],function(a){a();});</script>
</head>
<body></body>
</html>

5.js加载器生成

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>不要温柔地走入AMD</title><script>/*1.暂不支持shim*/    var req = {};req.requireConfig = {};req.userConfig= {};// 用来记录js加载的数目
    req.jsLoadCount = 0;function baseUrlParse(baseUrl){var str_length = baseUrl.length,newBaseUrl = "";if(baseUrl.lastIndexOf("/") == str_length -1){}else{newBaseUrl = baseUrl + "/";}return newBaseUrl;}function getObjSize(obj){var size = 0;for(var i in obj){var item = obj[i];if(item !== null && typeof(item) !== "undefined"){size++;}}return size;}var define = function(deps,fn){var protocal = location.protocal,host = location.host,port = location.port,pathName = location.pathname,href = location.href,paths = req.userConfig.paths,baseUrl = req.userConfig.baseUrl || "";// 不支持IE// 1.获取当前js文件地址var scriptSrc = document.currentScript.src;for (var i in paths) {var path = paths[i],complete_path = "";// 2. 生成complete_pathvar backslash_pos = href.lastIndexOf("/"),slash_href = href.substring(0,backslash_pos+1),complete_path = slash_href + baseUrlParse(baseUrl) + path;// 3. 根据文件地址进行匹配,从而生成req.requireConfigif(scriptSrc == complete_path){req.requireConfig[i] = {"deps":deps,"fn":fn};}};};var require = function(deps,fn){// 检测js加载完毕与否var timer_loader = setTimeout(function(){if(req.jsLoadCount == 0){clearTimeout(timer_loader);mainRequire();}else{timer_loader();}},200);function mainRequire(){function arrayClone(arr){var _array = [];for(var i=0,l=arr.length; i<l; i++){_array.push(arr[i]);}return _array;}function loopDepJudge(currentKey,currentDeps, circleArr){var check_arr = [];check_arr.unshift(arrayClone(currentDeps) );var keyChain = [currentKey];// 开始循环
            (function(){var currentDeps = check_arr[0];// console.log(currentDeps);if(currentDeps.length > 0){var nextKey = currentDeps.shift(),nextDeps = circleArr[nextKey];if(keyChain.indexOf(nextKey) > -1){keyChain = [false,nextKey,keyChain];return;}else{keyChain.push(nextKey);}if(nextDeps.length > 0){check_arr.unshift(arrayClone(nextDeps));}else{check_arr.shift();keyChain = [currentKey];if(check_arr.length == 0){return;}}}else{return;}arguments.callee();})();return keyChain;}var config = req.requireConfig,deps_arr = [],excute_obj = {},deps_chain = [];for(var i in config){deps_chain.push(i);}console.log(config);// 循环依赖检测
        (function(){var circle_deps = {};deps_chain.forEach(function(configName){circle_deps[configName] = config[configName]["deps"];});console.log(circle_deps);deps_chain.forEach(function(configName){var key = configName,deps = arrayClone(circle_deps[key]);var keyChain = loopDepJudge(key,deps,circle_deps);if(keyChain[0] == false){throw new Error("前方高能,有循环依赖。他们是"+keyChain[1]+"和" +keyChain[2]);}else{console.log(keyChain)}});})();// 包装各个依赖函数
        deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],item_fn = function(){return item["fn"].apply(window,excute_obj[configName]["deps"])();};excute_obj[configName] = {};excute_obj[configName]["fn"] = item_fn;});// 依赖函数的参数数组生成
        deps_chain.forEach(function(configName){var item = config[configName],item_deps = item["deps"],param_arr = [];item_deps.forEach(function(i){param_arr.push(excute_obj[i]["fn"]);});excute_obj[configName]["deps"] = param_arr;});// 主函数的参数数组生成
        deps.forEach(function(configName){deps_arr.push(excute_obj[configName]["fn"]);});fn.apply(window,deps_arr);
}};require.config = function(config_obj){req.userConfig = config_obj;req.jsLoadCount = getObjSize(config_obj.paths);function generateScript(url,loadCount){var _script = document.createElement('script');_script.type = 'text/javascript';_script.charset = 'utf-8';_script.async = true;_script.src = url;_script.onload = function(){req.jsLoadCount--;};_script.onerror = function(e){throw new Error(e);};var fs = document.getElementsByTagName('script')[0];fs.parentNode.insertBefore(_script, fs);}var href = location.href,baseUrl = req.userConfig.baseUrl || "";paths =  req.userConfig.paths;for(var i in paths){var path = paths[i],backslash_pos = href.lastIndexOf("/"),slash_href = href.substring(0,backslash_pos+1),complete_path = slash_href + baseUrlParse(baseUrl) + path;generateScript(complete_path);}}require.config({"baseUrl":"","paths":{"c":"c.js?v=3","a":"a.js","b":"b.js"}});require(["a","b"],function(a,b){a();b();});</script></head>
<body></body>
</html>

不要温柔地走入AMD相关推荐

  1. 一位小创业者血泪史:培养过很多技术大佬,但我还在发传单(转)

    猎云注:在互联网这个高度竞争机会稍纵即逝的行业中,不少人抓住了机遇一鸣惊人,而更多的是失意者.以下为嫁拍网 CEO 陈晓峰的一篇反思文章,从中回顾此前在百度担任某业务负责人先后带过的"小弟& ...

  2. 那些年,我培养过的大佬

    当已过而立之年的我被老板催单子.站在阜成门地铁站门口发传单的时候,我的人生跌入谷底.我怎么会混到这个地步? 清华毕业后,我做过百度高级经理,在人人网主持过风车网旅游项目,带领过 360 搜索引擎的开发 ...

  3. AMD之A系列APU问世 引领平板市场与高清视频

    图:AMD LlanoAPU 2011年6月14日,AMD正式发布了全新的主流笔记本平台--"Sabine",Sabine平台采用了代号为Llano的A系列APU,AMD在Sabi ...

  4. 8月第四周回顾:四核产品将发口角先起 AMD遭遇跳票流言

    2007年的9月将是服务器历史上比较重要的一个时刻,因为英特尔和AMD都将隆重发布自己的四核处理器.然而就在上周,一则关于AMD推迟发布产品的传言,使两家公司的竞争先从"口"上开始 ...

  5. AMD统一渲染GPU架构 历程回顾与评测

    AMD统一渲染GPU架构 历程回顾与评测     前言:NVIDIA公司历经长时间酝酿的Fermi架构高端产品GTX480/GTX470发布已经结束,经历了长达一个月的忙碌,我们已经了解到了这款产品的 ...

  6. amd cpu排行_最新CPU性能排行榜,兼顾游戏和专业的究极神器

    是的,你们没有看错!那个帅气的我,又来了.这次给大家带来了最新(目前主流最强)的CPU排行榜.这个榜单说真的还不是我自己弄的.而是由德国一家评测媒体PCGH公布的相对权威排行榜,涵盖了AMD.Inte ...

  7. 适用于AMD ROC GPU的Numba概述

    适用于AMD ROC GPU的Numba概述 Numba通过按照HSA执行模型将Python代码的受限子集直接编译到HSA内核和设备功能中,从而支持AMD ROC GPU编程.用Numba编写的内核似 ...

  8. AMD Ryzen 5000‘Cezanne’APU

    AMD Ryzen 5000'Cezanne'APU Spotted,Zen 3&7nm Vega芯片将在2021年前保留AM4支持 AMD Ryzen 5000 'Cezanne' APU ...

  9. AMD–7nm “Rome”芯片SOC体系结构,支持64核

    AMD–7nm "Rome"芯片SOC体系结构,支持64核 AMD Fully Discloses Zeppelin SOC Architecture Details at ISS ...

最新文章

  1. 如何用数据结构解释计算机系统 常用数据结构
  2. 小程序之获取用户信息取消授权处理
  3. jQuery美化select下拉框
  4. spring冲刺第一天
  5. Qt Creator创建项目
  6. 单页面axios_Axios封装之取消重复请求和接口缓存
  7. 负责域名解析的DNS服务
  8. 互联网广告系统综述一生态圈
  9. 学习使用资源文件[2] - Ico
  10. Fiddler访问百度
  11. 应网友邀请参加了2011年度51CTO的IT博客大赛
  12. 解决C#中ListView闪烁的办法
  13. Java程序员技术栈
  14. C/C++常用工具一览
  15. NOI2003 智破连环阵
  16. 收敛因子和黄金正弦指引机制的蝴蝶优化算法
  17. [扩展阅读] EasyGUI 学习文档【超详细中文版】
  18. 3 Linux 10个主流发行版本
  19. Flash Professional / 处理 Flash 文档 XFL(XML格式描述的CS5 FLA)
  20. js关于时间(date)的比较

热门文章

  1. 代码随想录算法训练营Day15|Leetcode102二叉树的层序遍历、Leetcode226翻转二叉树、Leetcode101对称二叉树
  2. Scanner的使用
  3. 【VR】Leap Motion 官网文档 HandModel(手部模型)
  4. python爬取图片并以二进制方式保存到本地
  5. R语言backtest函数
  6. android pin码 经典蓝牙_Android 蓝牙 pin 自动配 setPin()方法有时候无效
  7. 换个角度,智能硬件也能这样玩
  8. HP Xeon 55xx上GPU的带宽问题
  9. 怎么样可以把网站部署到阿里云服务器
  10. 计算机组成原理实验运动码表,计算机组成原理实验【参考】.doc