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 相关文章推荐
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
getComputedStyle与currentStyle获取样式(style/class)
Mar 19 Javascript
读取input:file的路径并显示本地图片的方法
Sep 23 Javascript
JS中取二维数组中最大值的方法汇总
Apr 17 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
Jan 25 Javascript
微信小程序 蓝牙的实现实例代码
Jun 27 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
Sep 08 Javascript
JS基于对象的链表实现与使用方法示例
Jan 31 Javascript
vue-cli配置flexible过程详解
Jul 04 Javascript
React学习之受控组件与数据共享实例分析
Jan 06 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
Jul 22 Javascript
vuex的数据渲染与修改浅析
Nov 26 Vue.js
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 清除网页病毒的方法
2008/12/05 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
document.open() 与 document.write()的区别
2007/08/13 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
JavaScript中Function详解
2015/02/27 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
Python中用于计算对数的log()方法
2015/05/15 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
python3学生名片管理v2.0版
2018/11/29 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
python ETL工具 pyetl
2020/06/07 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
企划主管岗位职责
2013/12/12 职场文书
公司培训欢迎词
2014/01/10 职场文书
公司收款委托书范本
2014/09/20 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
旅行社计调工作总结
2015/08/12 职场文书
中学团支部工作总结
2015/08/13 职场文书
七年级生物教学反思
2016/02/20 职场文书
ant design charts 获取后端接口数据展示
2022/05/25 Javascript