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 相关文章推荐
读jQuery之五(取DOM元素)
Jun 20 Javascript
利用js 进行输入框自动匹配字符的小例子
Jun 29 Javascript
jQuery中:eq()选择器用法实例
Dec 29 Javascript
jQuery视差滚动效果网页实现方法经验总结
Sep 29 Javascript
JavaScript闭包和范围实例详解
Dec 19 Javascript
js仿小米手机上下滑动效果
Feb 05 Javascript
php输出全部gb2312编码内的汉字方法
Mar 04 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
Apr 25 jQuery
详解Vue的computed(计算属性)使用实例之TodoList
Aug 07 Javascript
JavaScript模块模式实例详解
Oct 25 Javascript
写一个移动端惯性滑动&amp;回弹Vue导航栏组件 ly-tab
Mar 06 Javascript
vue实现移动端返回顶部
Oct 12 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
一个显示天气预报的程序
2006/10/09 PHP
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
javascript 自动转到命名锚记
2009/01/10 Javascript
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
jQuery异步上传文件插件ajaxFileUpload详细介绍
2015/05/19 Javascript
jquery模拟alert的弹窗插件
2015/07/31 Javascript
jquery选择器简述
2015/08/31 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
vue.js 获取当前自定义属性值
2017/06/01 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
输入一行文字,找出其中大写字母、小写字母、空格、数字、及其他字符各有多少
2016/04/15 面试题
测绘工程本科生求职信
2013/10/10 职场文书
亲子活动总结
2014/04/26 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
英文升职感谢信
2015/01/23 职场文书
小学入学感言
2015/08/01 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技