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的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 Javascript
把jQuery的类、插件封装成seajs的模块的方法
Mar 12 Javascript
jquery删除指定子元素代码实例
Jan 13 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
学习使用jquery iScroll.js移动端滚动条插件
Mar 24 Javascript
深入学习jQuery中的data()
Dec 22 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
Dec 15 Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 Javascript
深入Node TCP模块的理解
Mar 13 Javascript
JavaScript内置对象之Array的使用小结
May 12 Javascript
详解vue组件之间的通信
Aug 30 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 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
PHP 函数学习简单小结
2010/07/08 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
无阻塞加载脚本分析[全]
2011/01/20 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
JS文本框不能输入空格验证方法
2013/03/19 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
Java Mybatis框架入门基础教程
2015/09/21 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
JS中的==运算: [''] == false —&gt;true
2016/07/24 Javascript
详解Angular2中的编程对象Observable
2016/09/17 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
Python中变量交换的例子
2014/08/25 Python
用python 实现在不确定行数情况下多行输入方法
2019/01/28 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
pycharm永久激活超详细教程
2020/10/29 Python
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
公司道歉信范文
2014/01/09 职场文书
协议书怎么写
2014/04/21 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
Python中三种花式打印的示例详解
2022/03/19 Python