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滚动条回到顶部的代码
Dec 06 Javascript
javascript正则匹配汉字、数字、字母、下划线
Apr 10 Javascript
js实现商品抛物线加入购物车特效
Nov 18 Javascript
Javascript中的arguments对象
Jun 20 Javascript
JS中setTimeout和setInterval的最大延时值详解
Feb 13 Javascript
Angular简单验证功能示例
Dec 22 Javascript
详解vue.js数据传递以及数据分发slot
Jan 20 Javascript
微信小程序使用Promise简化回调
Feb 06 Javascript
JavaScript对象的特性与实践应用深入详解
Dec 30 Javascript
详解基于原生JS验证表单组件xy-form
Aug 20 Javascript
JS实现导航栏楼层特效
Jan 01 Javascript
javascript异常处理实现原理详解
Feb 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
php利用cookie实现自动登录的方法
2014/12/10 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
提取字符串中年月日的函数代码
2013/11/05 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
javascript如何使用bind指定接收者
2014/05/04 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
js实现聊天对话框
2020/02/08 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
python使用matplotlib绘制折线图教程
2017/02/08 Python
python 性能优化方法小结
2017/03/31 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
Python telnet登陆功能实现代码
2020/04/16 Python
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
大学生毕业求职自荐书范文
2014/02/04 职场文书
生产文员岗位职责
2014/04/05 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
学校端午节活动方案
2014/08/23 职场文书
离婚协议书范文2014
2014/10/16 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
高中历史教学反思
2016/02/19 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
SQL 聚合、分组和排序
2021/11/11 MySQL