惰性函数

需求

咱们如今须要写一个 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); } } })();

当咱们每次都须要进行条件判断,其实只须要判断一次,接下来的使用方式都不会发生改变的时候,想一想是否能够考虑使用惰性函数。

相关文章
相关标签/搜索