JavaScript 函数惰性载入的实现及其优点介绍

 更新时间:2013年08月12日 16:01:49   作者:  
惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了
最近看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库在在加载的时候就根据浏览器不同而执行很多分支,把所有东西实现设置好,而惰性载入函数将计算延迟,不影响初始脚本的执行时间。

相关文章

  • js实现select下拉框菜单

    js实现select下拉框菜单

    这篇文章主要介绍了js实现select下拉框菜单的详细代码,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • 前端实现Word在线预览功能详解

    前端实现Word在线预览功能详解

    这篇文章主要给大家介绍了关于前端实现Word在线预览功能的相关资料,工作中经常有时会遇到需要给用户创建word文档并实现word文档在线预览的需求,需要的朋友可以参考下
    2023-09-09
  • 在bootstrap中实现轮播图实例代码

    在bootstrap中实现轮播图实例代码

    Bootstrap中轮播图插件叫作Carousel ,下面通过本文给大家详细介绍了bootstrop中实现轮播图效果,需要的朋友参考下
    2017-06-06
  • php is_numberic函数造成的SQL注入漏洞

    php is_numberic函数造成的SQL注入漏洞

    这篇文章主要介绍了php is_numberic函数造成的SQL注入漏洞和解决办法,需要的朋友可以参考下
    2014-03-03
  • js 遍历对象的属性的代码

    js 遍历对象的属性的代码

    js 遍历对象的属性的代码,遍历出对象的属性可以用for in语句使用方法
    2011-12-12
  • 深入理解基于vue-cli的webpack打包优化实践及探索

    深入理解基于vue-cli的webpack打包优化实践及探索

    这篇文章主要介绍了基于vue-cli的webpack打包优化实践及探索,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • javascript 面向对象技术基础教程

    javascript 面向对象技术基础教程

    看了很多介绍javascript面向对象技术的文章,很晕.为什么?不是因为写得不好,而是因为太深奥.
    2009-12-12
  • cocos2dx骨骼动画Armature源码剖析(一)

    cocos2dx骨骼动画Armature源码剖析(一)

    cocos2dx中的骨骼动画在程序中使用非常方便,从编辑器(cocostudio或flash插件dragonBones)得到xml或json数据,调用代码就可以直接展示出动画效果,下面通过本篇文章给大家分享cocos2dx骨骼动画Armature源码剖析,需要的朋友一起来学习吧。
    2015-09-09
  • TS中最常见的声明合并(接口合并)

    TS中最常见的声明合并(接口合并)

    这篇文章主要介绍了TS中最常见的声明合并:接口合并,TS中的声明合并,指的就是编译器会针对同名的声明合并为一个声明,合并后的声明会同时拥有原先两个或多个声明的特性,接口的合并也是一样,它会将双方的成员放到一个同名的接口里,更多详细内容请参考下面文章内容

    2021-12-12
  • JS组件系列之Gojs组件 前端图形化插件之利器

    JS组件系列之Gojs组件 前端图形化插件之利器

    这篇文章主要介绍了Gojs组件,前端图形化插件之利器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11

最新评论