首页 > 这段代码怎么被优化了?

这段代码怎么被优化了?

这是我在《高级3》看到的一段代码,不明白这种写法怎么被优化了?

    function createXHR () {
        if (typeof XMLHttpRequest != 'undefined') {
            createXHR = function () {
                return new XMLHttpRequest();
            };
        }else if(typeof ActiveXObject != 'undefined'){
            createXHR = function () {
                if (typeof arguments.callee.activeXString != 'string') {
                    var version =["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0"],
                        i,len;
                        
                    for (i=0,len=version.length;i<len;i++) {
                        try{
                            new ActiveXobject[version[i]];
                            arguments.callee.activeXString = versions[i];
                            break;
                        }catch(ex){
                            //skip
                        }
                    }
                }
            }
        }else{
            createXHR = function () {
                throw new Error("No XHR object available.");
            }
        }
        
        return createXHR();
    }
    createXHR ();

惰性载入函数,函数被第一次执行时会被新的函数覆盖,之后执行时就不需要进行浏览器能力检测。


这叫lazy assignment

本来呢,createXHR要根据不同环境执行不同代码,但由于运行环境的不变性,每执行一次createXHR就判断一次显然太浪费性能了;如果是一开始就根据不同环境给createXHR赋不同的值,在某些情况下也很浪费,因为你不一定会用到它。

而这种方法,只在第一次执行时判断环境并给createXHR赋上不同的值,这就完美解决了上面的问题。


  1. 首先JS中函数也是对象,函数也是可以被定义赋值,修改的

  2. 注意到没有函数的名为createXHR
    在函数体中
    createXHR = function () { 就是对函数重新赋值
    经过不同的条件判断后,createXHR函数已经不是最初定义时候的模样啦,已经有了新的定义
    函数体的最后
    return createXHR(); 此时的createXHR已经不是函数声明的时候的那个喽,是在函数体中被重新赋值过的

可以用立即执行函数+闭包实现这个,好理解写:

var createXHR=(function(){
    var getXHRFunc;
    if (typeof XMLHttpRequest != 'undefined') {
            getXHRFunc = function () {
                return new XMLHttpRequest();
            };
        }else if(typeof ActiveXObject != 'undefined'){
            getXHRFunc = function () {
                if (typeof arguments.callee.activeXString != 'string') {
                    var version =["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0"],
                        i,len;
                        
                    for (i=0,len=version.length;i<len;i++) {
                        try{
                            new ActiveXobject[version[i]];
                            arguments.callee.activeXString = versions[i];
                            break;
                        }catch(ex){
                            //skip
                        }
                    }
                }
            }
        }else{
            getXHRFunc = function () {
                throw new Error("No XHR object available.");
            }
        }
        
        return function(){
            return getXHRFunc;
        }
        
}());

具体是怎么判断的,还是不懂啊

【热门文章】
【热门文章】