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 相关文章推荐
解读IE和firefox下JScript和HREF的执行顺序
Jan 12 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
Jun 05 Javascript
Node.js的包详细介绍
Jan 14 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
Jun 19 Javascript
基于javascript实现仿百度输入框自动匹配功能
Jan 03 Javascript
jQuery操作cookie
Aug 08 Javascript
WEB开发之注册页面验证码倒计时代码的实现
Dec 15 Javascript
Angular实现跨域(搜索框的下拉列表)
Feb 16 Javascript
微信小程序 数据绑定及运算的简单实例
Sep 20 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
Mar 06 Javascript
原生js实现的观察者和订阅者模式简单示例
Apr 18 Javascript
一篇文章学会Vue中间件管道
Jun 20 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中截取中文字符串的代码小结
2011/07/17 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
input file获得文件根目录简单实现
2013/04/26 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
分享一则PHP定义函数代码
2015/02/26 PHP
PHP实现微信发红包程序
2015/08/24 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
详解AngularJS 模块化
2017/06/14 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
查看keras的默认backend实现方式
2020/06/19 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
求网格中的黑点分布
2013/11/06 面试题
2014年教师节活动总结
2014/08/29 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
毕业设计答辩开场白
2015/05/29 职场文书
Python基础之变量的相关知识总结
2021/06/23 Python
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server