1. 程式人生 > 實用技巧 >惰性函式

惰性函式

函式高階3

函式重寫

一個函式執行之後, 被另一個函式覆蓋了。 其實就是你之前函式指標, 指向了另一個新函式.

function fun_a(){
	console.log('fun_a');
	fun_a = function(){
		console.log("fun_b");
	}
}

fun_a();  // fun_a,  並且讓fun_a指向新函式
fun_a();  // fun_b

看例子

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;
    }
}

每次給瀏覽新增事件的時候,都會做判斷。 其實,我們在第一次用addEvent函式的時候,就已經可以確定瀏覽器了,之後所有呼叫addEvent都會做同樣的判斷,走同樣的分支。在上面我們已經知道了 函式重寫了, 那麼我們在一次做出判斷之後,重寫 addEvent 函式,這樣以後呼叫的時候就不需要判斷了。
改寫成如下形式: 利用到了立即執行函式,在函式載入的時候就做出了判斷,返回確定函式

var 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;
        }
    }
})();

惰性函式

惰性函式的本質是函式重寫。
惰性函式, 是指在執行之後才能確定函式本身,不是確定在定義時。

適用場景

  1. 應用頻繁,如果只用一次,是體現不出它的優點出來的,用的次數越多,越能體現這種模式的優勢所在;
  2. 分支判斷,呼叫的所有結果都會走同樣的分支。
    適用瀏覽器的相容性。