JS优化与惰性载入函数实例分析


Posted in Javascript onApril 06, 2017

本文实例讲述了JS优化与惰性载入函数。分享给大家供大家参考,具体如下:

惰性载入函数

由于现在浏览器之间的差异,为了实现跨浏览器工作,很多函数要书写大量if语句或者try…catch…语句。当每次调用函数时,都要对每个if分支或try语句进行检查,这样会使得浏览器反应变慢。实际上,当我们用某个浏览器打开网页时,就决定了某个if分支或try语句是可用的,没有必要每次调用都检查。为了解决以上问题,JavaScript中出现一种名为惰性载入的技巧。

惰性载入表示函数执行的分支仅会发生一次。有两种实现惰性载入的方式:在函数被调用时再处理函数;在声明函数时就指定适当函数。

借用JavaScript高级程序设计中的例子来说明这两种解决方案。

创建XHR对象的兼容写法如下:

function createXHR(){
  if (typeof XMLHttpRequest != "undefined"){
    return new XMLHttpRequest();
  } else if (typeof ActiveXObject != "undefined"){
    if (typeof arguments.callee.activeXString != "string"){
      var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
              "MSXML2.XMLHttp"];
      for (var i=0,len=versions.length; i < len; i++){
        try {
          var xhr = new ActiveXObject(versions[i]);
          arguments.callee.activeXString = versions[i];
          return xhr;
        } catch (ex){
          //skip
        }
      }
    }
    return new ActiveXObject(arguments.callee.activeXString);
  } else {
    throw new Error("No XHR object available.");
  }
}

使用惰性载入的第一种方法——在函数被调用时再处理函数:

function createXHR(){
  if(typeof XMLHttpRequest!="undefined"){
    createXHR=function(){
      return new XMLHttpRequest();
    };
  }else if(typeof ActiveXObject!="undefined"){
    createXHR=function(){
      if(typeof arguments.callee.activeXString!="string"){
        var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
          i,len;
        for(i=0,len=versions.length;i<len;i++){
          try{
            new ActiveXObject(versions[i]);
            arguments.callee.activeXString=versions[i];
            break;
          }catch(ex){
            //skip
          }
        }
      }
      return new ActiveXObject(arguments.callee.activeXString);
    };
  }else{
    createXHR=function(){
      throw new Error("No XHR object available.");
    };
  }
  return CreateXHR();
}

使用惰性载入的第二种方法——在声明函数时就指定适当函数:

var createXHR=(function(){
  if(typeof XMLHttpRequest!="undefined"){
    return function(){
      return new XMLHttpRequest();
    };
  }else if(typeof ActiveXObject!="undefined"){
    return function(){
      if(typeof arguments.callee.activeXString!="string"){
        var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
          i,len;
        for(i=0,len=versions.length;i<len;i++){
          try{
            new ActiveXObject(versions[i]);
            arguments.callee.activeXString=versions[i];
            break;
          }catch(ex){
            //skip
          }
        }
      }
      return new ActiveXObject(arguments.callee.activeXString);
    };
  }else{
    return function(){
      throw new Error("No XHR object available.");
    };
  }
})();

上例中,使用的是一个匿名、自执行的函数,用以确定应该使用哪个函数。

以上两种使用惰性载入函数的共同优点是,只在第一次执行函数时牺牲部分性能,可以提高代码效率。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jquery ajax 同步异步的执行示例代码
Jun 23 Javascript
jquery 单击li防止重复加载的实现代码
Dec 24 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
Dec 28 Javascript
jQuery插件实现可输入和自动匹配的下拉框
Oct 24 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
Mar 06 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
Mar 09 Javascript
微信小程序 图片宽高自适应详解
May 11 Javascript
vue引入swiper插件的使用实例
Jul 19 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
Nov 06 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
Oct 19 Javascript
JS实现简单省市二级联动
Nov 27 Javascript
js中Object.create实例用法详解
Oct 05 Javascript
大白话讲解JavaScript的Promise
Apr 06 #Javascript
JS实现的二叉树算法完整实例
Apr 06 #Javascript
JavaScript结合HTML DOM实现联动菜单
Apr 05 #Javascript
js实现按座位号抽奖
Apr 05 #Javascript
Angularjs 实现移动端在线测评效果(推荐)
Apr 05 #Javascript
微信小程序中的onLoad详解及简单实例
Apr 05 #Javascript
微信小程序 页面跳转如何实现传值
Apr 05 #Javascript
You might like
德劲1103二次变频版的打磨
2021/03/02 无线电
php5 mysql分页实例代码
2008/04/10 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
Angular实现响应式表单
2017/08/04 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
5种Python单例模式的实现方式
2016/01/14 Python
Python3实现Web网页图片下载
2016/01/28 Python
python3 pygame实现接小球游戏
2019/05/14 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
python 制作本地应用搜索工具
2021/02/27 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
应用艺术专业个人的自我评价
2014/01/03 职场文书
网络编辑职责
2014/03/01 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
行政答辩状范文
2015/05/21 职场文书
演讲比赛主持词
2015/06/29 职场文书
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers