JavaScript 函数惰性载入的实现及其优点介绍

时间:2024-04-16 09:25:37 

最近看JavaScript高级程序设计,大有收获,接下来几天写一下读书笔记。之前写了一篇Ajax初步理解的随笔,里面有个函数用来创建XmlHttpRequest对象,浏览器兼容性原因,写出的代码通过大量if判断或者try,catch语句将函数引导到正确代码处。


<script type="text/javascript">
function createXHR(){
var xhr = null;
try {
// Firefox, Opera 8.0+, Safari,IE7+
xhr = new XMLHttpRequest();
}
catch (e) {
// Internet Explorer
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
xhr = null;
}
}
}
return xhr;
}
</script>


每次调用这个函数的时候,都要先进行浏览器能力检查,首先检查浏览器是否支持内置的XMLHyypRequest对象,如果不支持然后检查各版本基于ActiveX的XMLHttpRequest,每次调用该函数都是这样,其实当第一次执行完后,如果浏览器支持某个特定XMLHttpRequest对象,那么下次执行的时候这种支持性并不会改变,没必要再进行一边检测,即使只有一个if语句,执行也肯定比没有要慢,如果我们可以让if语句不必每次执行,那么就可以在频繁调用的情况下提高执行速度。解决方案就是称之为惰性载入的技巧。

惰性载入

惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。createXHR函数可以被改写为这样


function createXHR(){
var xhr=null;
if(typeof XMLHttpRequest !='undefined'){
xhr = new XMLHttpRequest();
createXHR=function(){
return new XMLHttpRequest();
}
}else{
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
createXHR=function(){
return new ActiveXObject("Msxml2.XMLHTTP");
}
}
catch (e) {
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
createXHR=function(){
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
catch (e) {
createXHR=function(){
return null;
}
}
}
}
return xhr;
}


在这个惰性载入的createXHR中第一次执行的时候每个分支都会为createXHR重新赋值,覆盖原函数,返回xhr对象,而第二次执行的时候就会直接调用重写后的函数,这样就不必执行每个分支重新做检测了。

优点

惰性载入函数有两个主要优点,第一是显而易见的效率问题,虽然在第一次执行的时候函数会意味赋值而执行的慢一些,但是后续的调用会因为避免的重复检测更快;第二个是要执行的适当代码只有当实际调用函数是才执行,很多JavaScript库在在加载的时候就根据浏览器不同而执行很多分支,把所有东西实现设置好,而惰性载入函数将计算延迟,不影响初始脚本的执行时间。

标签:JavaScript,函数惰性载入
0
投稿

猜你喜欢

  • 网页屏蔽鼠标左右键和键盘按键功能

    2007-10-17 21:30:00
  • python基础教程之分支、循环简单用法

    2021-05-30 08:51:48
  • jquery的父、子、兄弟节点查找,节点的子节点循环方法

    2023-07-02 05:34:40
  • Python中range、np.arange和np.linspace的区别

    2023-10-17 14:45:14
  • jsp include文件时的一个乱码解决方法

    2024-03-27 19:34:28
  • sql server 编译与重编译详解

    2024-01-14 11:02:59
  • 带你一文搞懂Python文件的读写操作

    2022-04-27 18:33:44
  • SQL Server修改表所有者

    2010-02-04 08:33:00
  • 解决Python3.8用pip安装turtle-0.0.2出现错误问题

    2021-04-07 03:51:20
  • vue-element如何实现动态换肤存储

    2024-04-27 15:57:35
  • python发送邮件脚本

    2022-01-28 03:04:58
  • 网页中英文混排行高不等问题

    2008-08-26 17:03:00
  • 浅谈webpack打包过程中因为图片的路径导致的问题

    2024-04-28 09:42:38
  • 2008年Logo设计10大趋势

    2008-02-28 13:06:00
  • Windows 8.1 64bit下搭建 Scrapy 0.22 环境

    2023-07-23 12:51:08
  • Python调用adb命令实现对多台设备同时进行reboot的方法

    2022-08-06 02:40:45
  • 在Python中等距取出一个数组其中n个数的实现方式

    2023-10-18 10:03:10
  • Google的产品设计指导思想

    2008-03-23 14:15:00
  • 基于Django用户认证系统详解

    2023-04-13 15:35:13
  • 2007/12/23更新创意无限,简单实用(javascript log)

    2024-04-26 17:11:46
  • asp之家 网络编程 m.aspxhome.com