什么是惰性函数
我的理解:一个函数无论执行多少次都会返回第一次执行的结果。
实现
例子:写一个 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;}}})();
参考:
