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 相关文章推荐
网页图片延时加载的js代码
Apr 22 Javascript
jquery 如何动态添加、删除class样式方法介绍
Nov 07 Javascript
jQuery使用hide方法隐藏元素自身用法实例
Mar 30 Javascript
jQuery使用drag效果实现自由拖拽div
Jun 11 Javascript
分析js闭包引起的事件注册问题
Mar 29 Javascript
JS中对象与字符串的互相转换详解
May 20 Javascript
jQ处理xml文件和xml字符串的方法(详解)
Nov 22 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
Jun 13 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
Jan 20 Javascript
Vue页面跳转动画效果的实现方法
Sep 23 Javascript
p5.js临摹动态图形实现方法详解
Oct 23 Javascript
Vue混入mixins滚动触底的方法
Nov 22 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
2020/08/24 PHP
求得div 下 img的src地址的js代码
2007/02/28 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
Angularjs实现搜索关键字高亮显示效果
2017/01/17 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
JS实现音量控制拖动
2020/01/15 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
Django中使用Celery的教程详解
2018/08/24 Python
使用TensorFlow实现SVM
2018/09/06 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python实现桌面托盘气泡提示
2019/07/29 Python
python 成功引入包但无法正常调用的解决
2020/03/09 Python
文秘专业个人求职信
2013/12/22 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
MySQL 数据丢失排查案例
2021/05/08 MySQL