惰性函数的定义和使用

342 阅读2分钟

一 定义:惰性函数表示函数第一次执行遇到分支时,会被某一分支重写为另一个更合适的函数,这个对原函数的调用就不必在经过分支的判断了。这常用于浏览器兼容性判断,比如对元素添加时间的时候,首先检查是否支持addEventListener,如果不支持,再检查是否支持attachEvent(ie老版本浏览器),如果还不支持,就只能用dom0级的方法添加事件。这个过程每次都要执行一遍,实际上如果浏览器支持其中的一种方法就会一直支持了,下次就没必要判断了。这就是惰性函数的应用,本质就是函数重写,有两种方法实现:
1 函数被调用时,在处理函数,函数第一次调用时,该函数会被覆盖为另一种更合适的函数,以后在执行,就调用这个函数了,

function addEvent(ele,type,fn){
    if(ele.addEventListener){
        addEvent = function(ele,type,fn){
            ele.addEventListener(type,fn,false);
        }
    }else if(ele.attachEvent){
        addEvent = function(ele,type,fn){
            ele.attachEvent('on'+type,fn); //老版本ie浏览器只支持冒泡,所以没有第三个参数,并且事件类型都以on开头,所以要进行拼接
        }
    }else{
        addEvent = function(ele,type,fn){
            ele['on'+type] = fn;
        }
    }
    return addEvent(ele,type,fn);
}
该方法有个缺点,要是函数名称改变的话,修改起来有点麻烦,要修改每个重新赋值的地方。
2 声明函数时就指定适当的函数,把嗅探浏览器的操作提前到代码加载的时候,在代码加载时就立即进行一次判断,以便让addEvent返回一个包裹了正确逻辑的函数:
let addEvent = (function(){
    if(document.addEventListener){
        return function(ele,type,fn){
            ele,addEventListener(type,fn,false);
        }
    }else if(document.attachEvent){
        return function(ele,type,fn){
            ele.attachEvent('on'+type,fn);
        }
    }else{
        return function(ele,type,fn){
            ele['on'+type] = fn;
        }
    }
})();