常用於函數庫的編寫 & 單例模式
-
先來看一個場景,要求編寫一個函數,只有當第一次調用該函數的時候,會返回
new Date().getTime()
,之後再調用該函數返回的還是第一次的返回值var time = null function getFirTime() { if (time) return time time = new Date().getTime() return time }
-
如上編寫方式依賴全局變量,且修改了全局變量,不符合純函數的理念
-
且除了第一次調用該函數外,其餘該函數的被調用,所進行的if條件判斷都是冗餘的。
將上面代碼修改爲惰性函數加以優化
var getFirTime = function () {
var time = new Date().getTime()
// 重寫GO上的方法,形成閉包
getFirTime = function () { return time }
return getFirTime()
}
惰性函數理念在庫函數編寫中的應用舉例
- 不使用惰性函數
function addEvent(dom, type, handler) {
if (dom.addEventListener) {
dom.addEventListener(type, handler, false) // false是使用的事件冒泡
} else {
dom.attachEvent('on' + type, handler)
}
}
- 但是這樣每次都會進入if判斷,所以我們引入惰性函數的理念
function addEvent(dom, type, handler) {
if (dom.addEventListener) {
dom.addEventListener(type, handler, false) // false是使用的事件冒泡
addEvent = function () {
dom.addEventListener(type, handler, false)
}
} else {
dom.attachEvent('on' + type, handler)
addEvent = function () {
dom.attachEvent('on' + type, handler)
}
}
}