定义:惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。
场景:调用一个函数,返回一个特定时间
var t;
function foo() {
if (t) {
return t;
}
t = new Date();
return t;
}
console.log( foo() ); // 函数每次执行都会进入判断(浪费性能),且会污染全局
console.log( foo() );
立即执行函数写法
// 使用立即执行函数也可以,但是我们这里主要讨论惰性函数
var foo = (function() {
var t = new Date();
return function() {
return t;
};
})();
console.log( foo() );
console.log( foo() );
惰性函数写法
var foo = function() {
var t = new Date();
foo = function() { // 这里给函数重新赋值,执行的就是这个函数,这就是惰性函数
return t;
}
return t; // 或者 return foo();
}
console.log( foo() );
console.log( foo() );
应用场景1:开发中我们经常要处理兼容性问题而封装方法
var addEvent = function(dom, type, handler){
if(dom.addEventListener){
dom.addEventListener(type, handler, false);
}else if(dom.attachEvent) {
dom.attachEvent('on' + type, handler)
}else {
dom['on' + type] = handler;
}
}
// 使用惰性函数
var addEvent = function(dom, type, handler){
if(dom.addEventListener){
addEvent = function(dom, type, handler) {
dom.addEventListener(type, handler, false);
}
}else if(dom.attachEvent) {
addEvent = function(dom, type, handler) {
dom.attachEvent('on' + type, handler)
}
}else {
addEvent = function(dom, type, handler) {
dom['on' + type] = handler;
}
}
}
应用场景2:单例模式:https://www.jianshu.com/p/4b8b89bc2a6c