咱们如今须要写一个 foo 函数,这个函数返回首次调用时的 Date 对象,注意是首次。浏览器
var t;
function foo() { if (t) return t; t = new Date() return t; }
问题有两个,一是污染了全局变量,二是每次调用 foo 的时候都须要进行一次判断。闭包
咱们很容易想到用闭包避免污染全局变量。函数
var foo = (function() { var t; return function() { if (t) return t; t = new Date(); return t; } })();
然而仍是没有解决调用时都必须进行一次判断的问题。spa
函数也是一种对象,利用这个特性,咱们也能够解决这个问题。对象
function foo() { if (foo.t) return foo.t; foo.t = new Date(); return foo.t; }
依旧没有解决调用时都必须进行一次判断的问题。事件
不错,惰性函数就是解决每次都要进行判断的这个问题,解决原理很简单,重写函数。io
var foo = function() { var t = new Date(); foo = function() { return t; }; return foo(); };
DOM 事件添加中,为了兼容现代浏览器和 IE 浏览器,咱们须要对浏览器环境进行一次判断:function
// 简化写法 function addEvent (type, el, fn) { if (window.addEventListener) { el.addEventListener(type, fn, false); } else if(window.attachEvent){ el.attachEvent('on' + type, fn); } }
问题在于咱们每当使用一次 addEvent 时都会进行一次判断。class
利用惰性函数,咱们能够这样作:变量
function addEvent (type, el, fn) { if (window.addEventListener) { addEvent = function (type, el, fn) { el.addEventListener(type, fn, false); } } else if(window.attachEvent){ addEvent = function (type, el, fn) { el.attachEvent('on' + type, fn); } } }
固然咱们也能够使用闭包的形式:
var addEvent = (function(){ if (window.addEventListener) { return function (type, el, fn) { el.addEventListener(type, fn, false); } } else if(window.attachEvent){ return function (type, el, fn) { el.attachEvent('on' + type, fn); } } })();
当咱们每次都须要进行条件判断,其实只须要判断一次,接下来的使用方式都不会发生改变的时候,想一想是否能够考虑使用惰性函数。