你不知道的祕密之惰性函數

常用於函數庫的編寫 & 單例模式

  • 先來看一個場景,要求編寫一個函數,只有當第一次調用該函數的時候,會返回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)
			}
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章