JavaScript 函数惰性载入

最近看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库在在加载的时候就根据浏览器不一样而执行不少分支,把全部东西实现设置好,而惰性载入函数将计算延迟,不影响初始脚本的执行时间。函数

相关文章
相关标签/搜索