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 相关文章推荐
最精简的JavaScript实现鼠标拖动效果的方法
May 11 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
Jun 26 Javascript
前端js实现文件的断点续传 后端PHP文件接收
Oct 14 Javascript
老生常谈原生JS执行环境与作用域
Nov 22 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
Dec 26 Javascript
jQuery基本选择器和层次选择器学习使用
Feb 27 Javascript
静态页面实现 include 引入公用代码的示例
Sep 25 Javascript
JavaScript模拟实现自由落体效果
Aug 28 Javascript
vue自定义全局共用函数详解
Sep 18 Javascript
原生js实现each方法实例代码详解
May 27 Javascript
jquery实现吸顶导航效果
Jan 08 jQuery
vue使用screenfull插件实现全屏功能
Sep 17 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
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
使用PHP开发留言板功能
2019/11/19 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
JavaScript 对象、函数和继承
2009/07/07 Javascript
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
如何使用python爬取csdn博客访问量
2016/02/14 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
教师试用期自我鉴定
2014/02/12 职场文书
亲子活动总结
2014/04/26 职场文书
小学生读书活动总结
2014/06/30 职场文书
出租房屋协议书
2014/09/14 职场文书
工作证明英文模板
2014/10/21 职场文书
2014年教研室工作总结
2014/12/06 职场文书
布达拉宫导游词
2015/02/02 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技