建议72:惰性载入函数
惰性载入函数主要解决的问题也是兼容性,原理跟分支函数类似,下面是简单的示例。
var addEvent = function(el, type, handle) {

addEvent = el.addEventListener ? function(el, type, handle) {el.addEventListener(type, handle, false);
} : function(el, type, handle) {el.attachEvent("on" + type, handle);
};
//在第一次执行addEvent函数时,修改了addEvent函数之后,必须执行一次
addEvent(el, type, handle);

}
从代码上看,惰性载入函数也是在函数内部改变自身的一种方式,这样在重复执行的时候就不会再进行兼容性方面的检测了。
惰性载入表示函数执行的分支仅会发生一次,即第一次调用的时候。在第一次调用的过程中,该函数会被覆盖为另一个按合适方式执行的函数,这样任何对原函数的调用都不用再经过执行的分支了。其优点如下:
要执行的适当代码只有在实际调用函数时才执行。
尽管第一次调用该函数会因额外的第二个函数调用而稍微慢点,但后续的调用都会很快,因为避免了多重条件。
由于浏览器之间的行为差异,多数JavaScript代码包含了大量的if语句,将执行引导到正确的代码中。
在下面惰性载入的createXHR()中,if语句的每个分支都会为createXHR()变量赋值,有效覆盖了原有的函数,最后一步便是调用新赋函数。下次调用createXHR()的时候,就会直接调用被分配的函数,这样就不用再次执行if语句。
function createXHR() {

if( typeof XMLHttpRequest != 'undefined') {return new XMLHttpRequest();
} else if( typeof ActiveXObject != 'undefined') {if( typeof arguments.callee.activeXString != 'string') { verversions = ["MSXML2.XMLHttp", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp.6.0"];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) {//跳过}}}return new ActiveXObject(arguments.callee.activeXString);
} else {throw new Error("No XHR object available.");
}

}
每一次调用createXHR()时都要对浏览器所支持的功能仔细检查,这样每次调用createXHR()时都要进行相同的测试就变得没有必要了。减少if语句使其不必每一次都执行,代码就会执行得快些。解决方案就是惰性载入的技巧。
function createXHR() {

if( typeof XMLHttpRequest != 'undefined') {createXHR = function() {return new XMLHttpRequest();};
} else if( typeof ActiveXObject != 'undefined') {createXHR = function() {if( typeof arguments.callee.activeXString != 'string') { verversions=["MSXML2.XMLHttp","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp.6.0"];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) {//跳过}}}return new ActiveXObject(arguments.callee.activeXString);};
} else {createXHR = function() {throw new Error("No XHR object available.");};
}
return createXHR();

}
如前面所述,if语句的每一个分支都会为createXHR变量赋值,有效覆盖了原有函数。最后一步便是调用新赋函数,下次调用creatXHR()的时候就会直接调用被分配的函数,这样就不用再次执行if语句。

JS编程建议——72:惰性载入函数相关推荐

  1. JavaScript惰性载入函数

    因为各大浏览器所使用的JS引擎不同,所以在实现某一个功能时都或多或少的存在差异,导致在写代码时要针对每一个功能给出兼容浏览器的不同实现方式,这样在运行代码时就会造成性能的损耗.所以就出现了惰性载入函数 ...

  2. JS编程建议——37:推荐使用replace(1)

    建议37:推荐使用replace(1) String对象的replace方法包含两个参数,第一个参数表示执行匹配的正则表达式,也可以传递字符串,第二个参数表示准备代替匹配的子字符串,例如,把字符串ht ...

  3. JS编程建议——2:正确辨析JavaScript句法中的词、句和段

    建议2:正确辨析JavaScript句法中的词.句和段 JavaScript语法包含了合法的JavaScript代码的所有规则和特征,它主要分为词法和句法.词法包括字符编码.名词规则.特殊词规则等.词 ...

  4. JS编程建议——32:使用制表

    建议32:使用制表 代码所做的事情越少,它的运行速度就越快,因此,避免重复工作很有意义.多次执行相同的任务也在浪费时间.制表法通过缓存先前计算结果为后续计算所使用,避免了重复工作,这使得制表成为递归算 ...

  5. JS编程建议——8:谨慎使用运算符(3)

    建议8:谨慎使用运算符(3) 要确保变量a的值为连续运算,可以使用小括号逻辑分隔符强迫4个数值先进行连续运算,然后再赋值. a = (1, 2, 3, 4); alert(a); //4 当使用var ...

  6. JS编程建议——7:小心保留字的误用

    建议7:小心保留字的误用 JavaScript语言中定义了很多备用或已经使用的保留字,按首字母顺序列出的保留字. 这些单词中的大多数并没有在语言中使用,但是根据JavaScript语法规则,这些单词是 ...

  7. JS编程建议——42:用好正则表达式静态值

    建议42:用好正则表达式静态值 正则表达式的静态属性比较特殊,有两个名字:长名(全称)和短名(简称,以美元符号开头表示),详细说明见表2.1. 表2.1 RegExp的静态属性 长名 短名 说明 in ...

  8. JS编程建议——52:建议使用splice删除数组

    建议52:建议使用splice删除数组 删除数组元素的方法有多种,最简单的方法是利用length属性来截断数组,但这种方法比较笨拙,仅能够截断尾部元素.在JavaScript中,由于数组其实就是对象, ...

  9. 翻译连载 | JavaScript轻量级函数式编程-第4章:组合函数 |《你不知道的JS》姊妹篇...

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  10. 翻译连载 | JavaScript轻量级函数式编程-第4章:组合函数 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

最新文章

  1. VC++ 隐藏控制台程序窗口
  2. 计算机网络的定义分类性能指标,第1章 计算机网络基础
  3. 【OpenCV3】几何图形(直线、矩形、圆、椭圆、多边形等)绘制
  4. 苹果数据线不能充电_外媒痛批苹果!iPhone 12不送充电器绝非为环保,理由太真实!|充电器|数据线|手机|iphone...
  5. 唔... 突然发现进入推荐博客了
  6. vuejs项目开发环境搭建(ESlint安装)
  7. python 柱形图_如何利用python 中的pyecharts包绘制柱形图
  8. python绘制相频特性曲线_python skimage图像处理(二)
  9. EPlan 下载和破解
  10. java种子_MC速通各类种子(java版,更新至6.26)
  11. 计算机系统组成思维导图
  12. 炫彩文字404动画页面源码
  13. 豆瓣电影数据可视化项目
  14. 渔港股份创业板IPO上会被否:审核被终止,曾计划募资3.3亿元
  15. linux下敏感文件(账号密码)查找—内网渗透linux主机密码收集
  16. python之捕鱼问题
  17. 一顿操作猛如虎,老罗也要啃老土
  18. 阿龙的学习笔记---CMake指定C++版本
  19. 【知识】快乐物质:多巴胺和内啡肽(内酚酞)的区别
  20. 每次压力大到爆,驾校教练总爱跑敬老院干这件事

热门文章

  1. 手动实现读写锁(线程级)
  2. Python 异常处理
  3. C#/ASP.NET MVC微信公众号接口开发之从零开发(三)回复消息 (附源码)
  4. appserv+win8
  5. Perl+批处理实现半自动批量生成动态通讯组
  6. 【转载】HTML之表单的设计(十)
  7. 使用回溯算法结合递归树+备忘录解决01背包问题
  8. javaScript常见的五种数组去重(转载)
  9. c#关于try catch finally的使用,判断日期格式是否正确
  10. debian分区方案(就这个看着靠谱点)转