JavaScript 函数惰性载入的实现及其优点介绍


Posted in Javascript onAugust 12, 2013

最近看JavaScript高级程序设计,大有收获,接下来几天写一下读书笔记。之前写了一篇Ajax初步理解的随笔,里面有个函数用来创建XmlHttpRequest对象,浏览器兼容性原因,写出的代码通过大量if判断或者try,catch语句将函数引导到正确代码处。

<script type="text/javascript"> 
function createXHR(){ 
var xhr = null; 
try { 
// Firefox, Opera 8.0+, Safari,IE7+ 
xhr = new XMLHttpRequest(); 
} 
catch (e) { 
// Internet Explorer 
try { 
xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
} 
catch (e) { 
try { 
xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
} 
catch (e) { 
xhr = null; 
} 
} 
} 
return xhr; 
} 
</script>

每次调用这个函数的时候,都要先进行浏览器能力检查,首先检查浏览器是否支持内置的XMLHyypRequest对象,如果不支持然后检查各版本基于ActiveX的XMLHttpRequest,每次调用该函数都是这样,其实当第一次执行完后,如果浏览器支持某个特定XMLHttpRequest对象,那么下次执行的时候这种支持性并不会改变,没必要再进行一边检测,即使只有一个if语句,执行也肯定比没有要慢,如果我们可以让if语句不必每次执行,那么就可以在频繁调用的情况下提高执行速度。解决方案就是称之为惰性载入的技巧。

惰性载入

惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。createXHR函数可以被改写为这样

function createXHR(){ 
var xhr=null; 
if(typeof XMLHttpRequest !='undefined'){ 
xhr = new XMLHttpRequest(); 
createXHR=function(){ 
return new XMLHttpRequest(); 
} 
}else{ 
try { 
xhr = new ActiveXObject("Msxml2.XMLHTTP"); 
createXHR=function(){ 
return new ActiveXObject("Msxml2.XMLHTTP"); 
} 
} 
catch (e) { 
try { 
xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
createXHR=function(){ 
return new ActiveXObject("Microsoft.XMLHTTP"); 
} 
} 
catch (e) { 
createXHR=function(){ 
return null; 
} 
} 
} 
} 
return xhr; 
}

在这个惰性载入的createXHR中第一次执行的时候每个分支都会为createXHR重新赋值,覆盖原函数,返回xhr对象,而第二次执行的时候就会直接调用重写后的函数,这样就不必执行每个分支重新做检测了。

优点

惰性载入函数有两个主要优点,第一是显而易见的效率问题,虽然在第一次执行的时候函数会意味赋值而执行的慢一些,但是后续的调用会因为避免的重复检测更快;第二个是要执行的适当代码只有当实际调用函数是才执行,很多JavaScript库在在加载的时候就根据浏览器不同而执行很多分支,把所有东西实现设置好,而惰性载入函数将计算延迟,不影响初始脚本的执行时间。

Javascript 相关文章推荐
js分解url参数(面向对象-极简主义法应用)
Aug 09 Javascript
关闭ie窗口清除Session的解决方法
Jan 10 Javascript
jquery ajax传递中文参数乱码问题及解决方法说明
Feb 07 Javascript
javascript 实现子父窗体互相传值的简单实例
Feb 17 Javascript
JS判断变量是否为空判断是否null
Jul 25 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
Aug 27 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
Jan 19 Javascript
浅谈对于react-thunk中间件的简单理解
May 01 Javascript
js尾调用优化的实现
May 23 Javascript
Vue 2.0 侦听器 watch属性代码详解
Jun 19 Javascript
Vue.js仿Select下拉框效果
Feb 18 Javascript
JS实现纸牌发牌动画
Jan 19 Javascript
document.write()及其输出内容的样式、位置控制
Aug 12 #Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
Aug 12 #Javascript
Js点击弹出下拉菜单效果实例
Aug 12 #Javascript
jQuery自动切换/点击切换选项卡效果的小例子
Aug 12 #Javascript
jquery 按钮状态效果 正常、移上、按下
Aug 12 #Javascript
checkbox设置复选框的只读效果不让用户勾选
Aug 12 #Javascript
Jquery easyui 下loaing效果示例代码
Aug 12 #Javascript
You might like
用PHP和ACCESS写聊天室(三)
2006/10/09 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
php常用字符串比较函数实例汇总
2014/11/24 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
python实现excel读写数据
2021/03/02 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
基于python进行抽样分布描述及实践详解
2019/09/02 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
公司员工的自我评价范例
2013/11/01 职场文书
四川省传达学习贯彻党的群众路线教育实践活动总结大会精神新闻稿
2014/10/26 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
护士求职自荐信
2015/03/25 职场文书