• JavaScript 函数惰性载入


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

  • 相关阅读:
    leetcode Power of Two
    leetcode Merge Two Sorted Lists
    Mac linux 安装memcached服务 用法
    Vsftp配置都没有问题 连接不上 530 Login incorrect 解决方法
    mysql 远程连接不上 %用户已经添加了
    Centos yum 安装mysql报错 No package mysql-server available.
    Linux 查询程序安装路径 是否安装
    php报错 Call to undefined function mb_stripos()
    mac编译openssl扩展报错 openssl.c:44:10: fatal error: 'openssl/evp.h' file not found
    在安装mysqli的时候,出现error: ext/mysqlnd/mysql_float_to_double.h: No such file or direc
  • 原文地址:https://www.cnblogs.com/dolphinX/p/3251165.html
Copyright © 2020-2023  润新知