惰性载入函数
因为各浏览器之间的行为的差异,我们经常会在函数中包含了大量的if语句,以检查浏览器特性,解决不同浏览器的兼容问题。比如,我们最常见的为dom节点添加事件的函数
function addevent(type, element, fun) {
if (element.addeventlistener) {
element.addeventlistener(type, fun, false);
}
else if(element.attachevent){
element.attachevent('on' + type, fun);
}
else{
element['on' + type] = fun;
}
}
每次调用addevent函数的时候,它都要对浏览器所支持的能力进行检查,首先检查是否支持addeventlistener方法,如果不支持,再检查是否支持attachevent方法,如果还不支持,就用dom0级的方法添加事件。这个过程,在addevent函数每次调用的时候都要走一遍,其实,如果浏览器支持其中的一种方法,那么他就会一直支持了,就没有必要再进行其他分支的检测了。也就是说,if语句不必每次都执行,代码可以运行的更快一些。
解决方案就是惰性载入。所谓惰性载入,指函数执行的分支只会发生一次
有两种实现惰性载入的方式
【1】第一种是在函数被调用时,再处理函数。函数在第一次调用时,该函数会被覆盖为另外一个按合适方式执行的函数,这样任何对原函数的调用都不用再经过执行的分支了
我们可以用下面的方式使用惰性载入重写addevent()
function addevent(type, element, fun) {
if (element.addeventlistener) {
addevent = function (type, element, fun) {
element.addeventlistener(type, fun, false);
}
}
else if(element.attachevent){
addevent = function (type, element, fun) {
element.attachevent('on' + type, fun);
}
}
else{
addevent = function (type, element, fun) {
element['on' + type] = fun;
}
}
return addevent(type, element, fun);
}
在这个惰性载入的addevent()中,if语句的每个分支都会为addevent变量赋值,有效覆盖了原函数。最后一步便是调用了新赋函数。下一次调用addevent()时,便会直接调用新赋值的函数,这样就不用再执行if语句了
但是,这种方法有个缺点,如果函数名称有所改变,修改起来比较麻烦
【2】第二种是声明函数时就指定适当的函数。 这样在第一次调用函数时就不会损失性能了,只在代码加载时会损失一点性能
以下就是按照这一思路重写的addevent()。以下代码创建了一个匿名的自执行函数,通过不同的分支以确定应该使用哪个函数实现
var addevent = (function () {
if (document.addeventlistener) {
return function (type, element, fun) {
element.addeventlistener(type, fun, false);
}
}
else if (document.attachevent) {
return function (type, element, fun) {
element.attachevent('on' + type, fun);
}
}
else {
return function (type, element, fun) {
element['on' + type] = fun;
}
}
})();
以上就是javascript函数中的惰性载入函数实例代码详解的详细内容。