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 isType() 类型判断代码
Feb 14 Javascript
javascript浏览器兼容教程之事件处理
Jun 09 Javascript
js使用removeChild方法动态删除div元素
Aug 01 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
Dec 17 Javascript
ReactJs快速入门教程(精华版)
Nov 28 Javascript
BootStrap fileinput.js文件上传组件实例代码
Feb 20 Javascript
基于Swiper实现移动端页面图片轮播效果
Dec 28 Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
Feb 03 Javascript
JavaScript的数据类型转换原则(干货)
Mar 15 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
Sep 21 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
Sep 21 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
jquery插件之easing使用
2010/08/19 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
Python中使用dom模块生成XML文件示例
2015/04/05 Python
python同时给两个收件人发送邮件的方法
2015/04/30 Python
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
详解python中的线程
2018/02/10 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
2020/08/07 Python
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
几道Web/Ajax的面试题
2016/11/05 面试题
自我鉴定三原则
2014/01/13 职场文书
银行实习生的自我评价
2014/01/13 职场文书
青年文明号服务承诺
2014/03/31 职场文书
材料化学专业求职信
2014/07/15 职场文书
同意转租证明
2015/06/24 职场文书
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js