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 对象中的类数组操作
Apr 27 Javascript
javascript document.compatMode兼容性
Feb 23 Javascript
js控制淡入淡出示例代码
Nov 12 Javascript
Javascript中设置默认参数值示例
Sep 11 Javascript
不想让浏览器运行javascript脚本的方法
Nov 20 Javascript
通过原生JS实现为元素添加事件的方法
Nov 23 Javascript
浅谈JavaScript的闭包函数
Dec 08 Javascript
JS 循环li添加点击事件 (闭包的应用)
Dec 10 Javascript
简单实现js点击展开二级菜单功能
May 16 Javascript
解析Vue 2.5的Diff算法
Nov 28 Javascript
详解Angular2学习笔记之Html属性绑定
Jan 03 Javascript
vue实现拖拽进度条
Mar 01 Vue.js
大白话讲解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动态图像的创建
2006/10/09 PHP
深入了解php4(1)--回到未来
2006/10/09 PHP
一个简单的PHP投票程序源码
2007/03/11 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
ie下jquery.getJSON的缓存问题的处理方法
2013/03/29 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
2014/10/11 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
vue动态删除从数据库倒入列表的某一条方法
2018/09/29 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
python解决字符串倒序输出的问题
2018/06/25 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
详解Python进阶之切片的误区与高级用法
2018/12/24 Python
Python 下载及安装详细步骤
2019/11/04 Python
Python实现AI换脸功能
2020/04/10 Python
Python求凸包及多边形面积教程
2020/04/12 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
C#怎么让一个窗口居中显示?
2015/10/20 面试题
2015年安置帮教工作总结
2015/05/22 职场文书
后天观后感
2015/06/08 职场文书