最近看JavaScript高级程序设计,大有收获,接下来几天写一下读书笔记。以前写了一篇Ajax初步理解的随笔,里面有个函数用来建立XmlHttpRequest对象,浏览器兼容性缘由,写出的代码经过大量if判断或者try,catch语句将函数引导到正确代码处。javascript
<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语句没必要每次执行,那么就能够在频繁调用的状况下提升执行速度。解决方案就是称之为惰性载入的技巧。html
惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程当中,该函数会被覆盖为另外一个按照合适方式执行的函数,这样任何对原函数的调用就不用再通过执行的分支了。createXHR函数能够被改写为这样java
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库在在加载的时候就根据浏览器不一样而执行不少分支,把全部东西实现设置好,而惰性载入函数将计算延迟,不影响初始脚本的执行时间。函数