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将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
JS实现仿QQ聊天窗口抖动特效
May 10 Javascript
JS使用cookie设置样式的方法
Jun 30 Javascript
纯js实现手风琴效果代码
Apr 17 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
Sep 04 Javascript
详解Vue2.0 事件派发与接收
Sep 05 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
Mar 10 Javascript
详解vue 不同环境配置不同的打包命令
Apr 07 Javascript
微信小程序Echarts覆盖正常组件问题解决
Jul 13 Javascript
jQuery三组基本动画与自定义动画操作实例总结
May 09 jQuery
详解小程序横屏方案对比
Jun 28 Javascript
使用Vant完成Dialog弹框案例
Nov 11 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
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
javascript克隆对象深度介绍
2012/11/20 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
js尾调用优化的实现
2019/05/23 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
python机器人运动范围问题的解答
2019/04/29 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
标准导师推荐信(医学类)
2013/10/28 职场文书
公关活动策划方案
2014/05/25 职场文书
另类冲刺标语
2014/06/24 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL