什么是惰性函数
我的理解:一个函数无论执行多少次都会返回第一次执行的结果。
实现
例子:写一个 foo 函数,这个函数返回首次执行的结果
方法一
let t;
function foo() {
if(t) return t;
t = new Date();
return t;
}
问题:一是使用了全局变量,二是每次调用 foo 都需再判断一次。
方法二
闭包解决全局变量
const foo = (function() {
let t;
return function() {
if(t) return t;
t = new Date();
return t;
}
})();
还是每一次都执行都需要判断一次。
方法三
不使用闭包
function foo() {
if(foo.t) return foo.t;
foo.t = new Date();
return foo.t;
}
方法四
惰性函数
var foo = function() {
var t = new Date();
foo = function() {
return t;
};
return foo();
}
应用
为了兼容现代浏览器和 IE 浏览器,我们需要对浏览器进行一些兼容性判断。
常见的 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;
}
}
每次判断的时候都需要执行一遍 if else 判断。
使用惰性求值
第一种实现是在事件函数第一次调用时,对函数本身进行二次处理,该函数会被覆盖为符合条件分支条件的函数,这样对原函数的调用就不用再经过 if else 分支了。
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);
}
第二种实现是在声明函数时就指定适当的函数。
const 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;
}
}
})();
参考: