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 相关文章推荐
兼容IE和FF的图片上传前预览js代码
May 28 Javascript
jquery mobile changepage的三种传参方法介绍
Sep 13 Javascript
js获取IP地址的方法小结
Jul 01 Javascript
node.js插件nodeclipse安装图文教程
Oct 19 Javascript
javaScript语法总结
Nov 25 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
Dec 26 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
Jan 12 Javascript
JS正则表达式验证密码格式的集中情况总结
Feb 23 Javascript
深入理解Vue.js轻量高效的前端组件化方案
Dec 10 Javascript
jQuery分组选择器简单用法示例
Apr 04 jQuery
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
Aug 15 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
Aug 21 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 模拟POST|GET操作实现代码
2010/07/20 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
jquery表单验证使用插件formValidator
2012/11/10 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
jQuery EasyUi 验证功能实例解析
2017/01/06 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
jquery获取transform里的值实现方法
2017/12/12 jQuery
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
jquery实现抽奖功能
2020/10/22 jQuery
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
Python的SQLAlchemy框架使用入门
2015/04/29 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
HTML5的标签的代码的简单介绍 HTML5标签的简介
2012/05/28 HTML / CSS
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
会计学专业学生的求职信范文
2014/01/27 职场文书
网络编辑职责
2014/03/01 职场文书
验房委托书
2014/08/30 职场文书
高一军训感想
2015/08/07 职场文书
银行培训心得体会范文
2016/01/09 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
css3带你实现3D转换效果
2022/02/24 HTML / CSS