JS编程建议——72:惰性载入函数

简介: 72:惰性载入函数

建议72:惰性载入函数
惰性载入函数主要解决的问题也是兼容性,原理跟分支函数类似,下面是简单的示例。
var addEvent = function(el, type, handle) {

addEvent = el.addEventListener ? function(el, type, handle) {
    el.addEventListener(type, handle, false);
} : function(el, type, handle) {
    el.attachEvent("on" + type, handle);
};
//在第一次执行addEvent函数时,修改了addEvent函数之后,必须执行一次
addEvent(el, type, handle);

}
从代码上看,惰性载入函数也是在函数内部改变自身的一种方式,这样在重复执行的时候就不会再进行兼容性方面的检测了。
惰性载入表示函数执行的分支仅会发生一次,即第一次调用的时候。在第一次调用的过程中,该函数会被覆盖为另一个按合适方式执行的函数,这样任何对原函数的调用都不用再经过执行的分支了。其优点如下:
要执行的适当代码只有在实际调用函数时才执行。
尽管第一次调用该函数会因额外的第二个函数调用而稍微慢点,但后续的调用都会很快,因为避免了多重条件。
由于浏览器之间的行为差异,多数JavaScript代码包含了大量的if语句,将执行引导到正确的代码中。
在下面惰性载入的createXHR()中,if语句的每个分支都会为createXHR()变量赋值,有效覆盖了原有的函数,最后一步便是调用新赋函数。下次调用createXHR()的时候,就会直接调用被分配的函数,这样就不用再次执行if语句。
function createXHR() {

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

}
每一次调用createXHR()时都要对浏览器所支持的功能仔细检查,这样每次调用createXHR()时都要进行相同的测试就变得没有必要了。减少if语句使其不必每一次都执行,代码就会执行得快些。解决方案就是惰性载入的技巧。
function createXHR() {

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

}
如前面所述,if语句的每一个分支都会为createXHR变量赋值,有效覆盖了原有函数。最后一步便是调用新赋函数,下次调用creatXHR()的时候就会直接调用被分配的函数,这样就不用再次执行if语句。

相关文章
|
15小时前
|
JavaScript 安全 前端开发
js的map函数
js的map函数
7 0
|
15小时前
|
JavaScript 前端开发
js的filter函数
js的filter函数
5 1
|
15小时前
|
JavaScript 前端开发
js的join函数
js的join函数
5 1
|
16小时前
|
开发框架 JavaScript .NET
Js字符串操作函数大全
Js字符串操作函数大全
6 1
|
2天前
|
JavaScript 前端开发 C语言
JavaScript编程语法练习
本篇文章是对于javaScript中if ,switch,while ,do-while,,for语法的作业练习.对于我来说也是对自己知识掌握的一种检验.是对js的基础语法进行的一次练习,通过有趣的示例进行练习,使得对于代码能够增加印象,对于知识的掌握更加透彻.
16 2
|
4天前
|
JavaScript 前端开发 C++
【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
【5月更文挑战第2天】【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
|
6天前
|
JavaScript 前端开发
<body> 中的JavaScript函数
【5月更文挑战第1天】<body> 中的JavaScript函数。
8 3
|
7天前
|
存储 移动开发 JavaScript
学习javascript,前端知识精讲,助力你轻松掌握
学习javascript,前端知识精讲,助力你轻松掌握
|
14天前
|
JavaScript 前端开发 测试技术
学习JavaScript
【4月更文挑战第23天】学习JavaScript
13 1
|
21天前
|
JavaScript 前端开发 应用服务中间件
node.js之第一天学习
node.js之第一天学习