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 去除数组的重复元素
May 04 Javascript
javascript通过class来获取元素实现代码
Feb 20 Javascript
用C/C++来实现 Node.js 的模块(二)
Sep 24 Javascript
node.js中Socket.IO的进阶使用技巧
Nov 04 Javascript
jQuery中:first-child选择器用法实例
Dec 31 Javascript
详解AngularJS控制器的使用
Mar 09 Javascript
Javascript删除指定元素节点的方法
Jun 21 Javascript
react native实现往服务器上传网络图片的实例
Aug 07 Javascript
js禁止Backspace键使浏览器后退的实现方法
Sep 01 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
详解Vue.js3.0 组件是如何渲染为DOM的
Nov 10 Javascript
vue前端工程的搭建
Mar 31 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中iconv函数使用方法
2008/05/24 PHP
php 静态化实现代码
2009/03/20 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
2012/10/11 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
python连接字符串的方法小结
2015/07/13 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
Python多进程编程multiprocessing代码实例
2020/03/12 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
params有什么用
2016/03/01 面试题
Linux的文件类型
2016/07/05 面试题
优秀党支部事迹材料
2014/01/14 职场文书
入党自荐书范文
2014/03/09 职场文书
教师党员一句话承诺
2014/03/28 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
军训口号
2014/06/13 职场文书
民间个人借款协议书
2014/09/30 职场文书
中学生国庆节演讲稿2015
2015/07/30 职场文书
九年级英语教学反思
2016/02/15 职场文书
五年级数学教学反思
2016/02/16 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
Java并发编程必备之Future机制
2021/06/30 Java/Android