js常用框架原理
(function(){ //存储已经创建的模块 var moduleMap = {}; //判断是否已经加载过 var fileMap = {}; //空函数 var noop = function(){}; /*注册为全局变量*/ window.thin = { //在这里定义的模块,都被注册到了moduleMap里面 /*define :主要作用moduleMap中注册模块 *name 模块的名称 *dependencies 模块的依赖项 *factory 模块的函数体 */ define:function(name,dependencies,factory){ if(!moduleMap[name]){ //模块的结构 var module = { name:name, dependencies:dependencies, factory:factory }; moduleMap[name] = module; } return moduleMap[name] }, /*use: 主要作用得到模块的使用权 *name 模块的名称 * */ use:function(name){ //module 需要使用的模块的引用 var module = moduleMap[name]; if(!module.entity){ //用来存储依赖项引用,用于传入factory,方便函数调用 var args = []; //遍历module的依赖项数组 for(var i=0;i<module.dependencies.length;i++){ //检测依赖项数组的entity属性,如果已经使用,获取引用 if(moduleMap[module.dependencies[i].entity]){ args.push(moduleMap[module.dependencies[i]].entity) } //如果没有使用,则获取这个模块的使用权 else{ args.push(this.use(module.dependencies[i])) } } module.entity = module.factory.apply(noop,args) //noop 空函数 } return module.entity; }, /*实现按需加载模块,而不是一次性加载所有模块 *实现原理:动态创建script标签,设置src,添加到document.head,监听完成的事件 *fileMap 记录已经加载的文件的路径,防止重复加载,当所有加载完,执行回调 */ require:function(pathArr,callback){ for(var i = 0;i<pathArr.length;i++){ var path = pathArr[i]; //如果还没有加载 if(!fileMap[path]){ var head = document.getElementByTagName("head")[0]; var node = document.createElement("script"); node.type= "text/javascript"; node.async="true"; node.src = path+".js"; //当加载完成后, node.onload = function(){ fileMap[path] = true; head.removeChild(node); checkAllFiles(); }; head.appendChild(node); } } function checkAllFiles(){ var allLoaded = true; //变量fileMap,如果有没有加载的,继续加载,加载完成以后,执行回调 for(var i=0;i<pathArr.length;i++){ if(!fileMap[pathArr[i]]){ allLoaded = false; break; } } if(allLoaded){ callback(); } } } } })();
js常用框架原理的更多相关文章
- js常用工具类.
一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...
- Js常用技巧
摘录:http://crasywind.blog.163.com/blog/static/7820316920091011643149/ js 常用技巧 1. on contextmenu=" ...
- JS常用的标准函数
原文:JS常用的标准函数 1.Array类型函数 array.concat(item...) 函数功能:关联数组,实现数组相加功能,但并不影响原先数组,concat返回新数组. array.join( ...
- JS 常用功能收集
JS 常用效果收集 1. 回到顶部>> 爱词霸
- JS常用校验方法(判断输入框是否为空,数字,电话,邮件,四舍五入等)
JS常用校验方法: 1.判断输入框是否为空,为空时弹出提示框 2.关闭窗口 3.检查输入字符串是否为数字 4.强制把大写转换成小写 5.手机号码校验,长度为11位数字. 6.电子邮件校验 7.电话号码 ...
- Node.js 常用工具
Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherit ...
- JS常用正则表达式备忘录
摘要: 玩转正则表达式. 原文:JS常用正则表达式备忘录 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正则表达式或"regex"用于匹配字符串的各个部分 下面是 ...
- js常用数据类型(Number,String,undefined,boolean) 引用类型( function,object,null ),其他数据类型( 数组Array,时间Date,正则RegExp ),数组与对象的使用
js常用数据类型 数字类型 | 字符串类型 | 未定义类型 | 布尔类型 typeof()函数查看变量类型 数字类型 Number var a1 = 10; var a2 = 3.66; conso ...
- js常用身份校验规则
js常用身份校验规则 var Validator = { extractBirth: function(id) { // 身份证提取出生年月 var re = null, split, year, m ...
随机推荐
- vim设置自动添加头部注释
#自己改了改vim开头文件,如下图# 友友们可以直接修改·SetTitle() if v:lang =~ "utf8$" || v:lang =~ "UTF-8$&quo ...
- python2,3的区别
python2和python3的区别: 1. python 2x:源代码不规范,源码重复多 python 3x:源码 清晰,简单,优美 2.python 2x:默认编码是ASCII码 编码更改: ...
- 202A 202B 202C 202D 202E字符的作用及解释
这里你会发现在值的前后有2个\u开头的控制字符:转换网址:http://www.jsons.cn/utf8/ 解释:https://blog.csdn.net/haiyan1111/article/d ...
- JVM的小总结(转)
ref:http://www.cnblogs.com/ityouknow/p/6482464.html 注1:看了大神:纯洁的微笑的JVM系列篇,发现好多地方还是似懂非懂,理解的并不透彻,jvm的调优 ...
- Kafka 的高可靠性是怎么实现的?
可以参见我这篇文章:Kafka 是如何保证数据可靠性和一致性
- MyBatis与Hibernate有哪些不同?
(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句. (2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活 ...
- List、Set、Map详解及区别
一.List接口 List是一个继承于Collection的接口,即List是集合中的一种.List是有序的队列,List中的每一个元素都有一个索引:第一个元素的索引值是0,往后的元素的索引值依次+1 ...
- Jpa 在CriteriaBuilder中添加where条件NotIn子查询
final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); final CriteriaQuery<Person> cq ...
- 用AltiumDesigner画完PCB生成gerber(光绘)文件详细说明
什么是gerber文件 Gerber文件是所有电路设计软件都可以产生的文件,在电子组装行业又称为模版文件(stencil data),在PCB制造业又称为光绘文件.可以说Ger ...
- css写作建议和性能优化小结
1.前言 还有几天就到国庆中秋了,快要放假了,先祝大家节日快乐!之前写过js的写作建议和技巧,那么今天就来聊聊css吧!说到css,每一个网页都离不开css,但是对于css,很多开发者的想法就是,cs ...