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 相关文章推荐
javascript demo 基本技巧
Dec 18 Javascript
Javascript面向对象编程(三) 非构造函数的继承
Aug 28 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
Nov 14 Javascript
JavaScript中获取样式的原生方法小结
Oct 08 Javascript
javascript跨域原因以及解决方案分享
Apr 08 Javascript
ECMAScript6块级作用域及新变量声明(let)
Jun 12 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
Nov 06 Javascript
AngularJs 国际化(I18n/L10n)详解
Sep 01 Javascript
字太多用...代替的方法(两种)
Mar 15 Javascript
详解JS数组Reduce()方法详解及高级技巧
Aug 18 Javascript
Vue.js实现的计算器功能完整示例
Jul 11 Javascript
JavaScript实时更新当前的时间的示例代码
Jul 15 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
PHP Google的translate API代码
2008/12/10 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
Js callBack 返回前一页的js方法
2008/11/30 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
python使用PyQt5的简单方法
2019/02/27 Python
python面试题之列表声明实例分析
2019/07/08 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
详解Python利用configparser对配置文件进行读写操作
2020/11/03 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
Linux Interview Questions For software testers
2013/05/17 面试题
建筑总经理岗位职责
2014/02/02 职场文书
测控技术自荐信
2014/06/05 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
新生开学寄语大全
2015/05/28 职场文书
Python使用MapReduce进行简单的销售统计
2022/04/22 Python