首頁  >  文章  >  web前端  >  javascript函數中的惰性載入函數實例程式碼詳解

javascript函數中的惰性載入函數實例程式碼詳解

伊谢尔伦
伊谢尔伦原創
2017-07-20 10:29:381364瀏覽

惰性載入函數

因為各瀏覽器之間的行為的差異,我們經常在函數中包含了大量的if語句,以檢查瀏覽器特性,解決不同瀏覽器相容的問題。例如,我們最常見的為dom節點新增事件的函數 


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函數的時候,它都要對瀏覽器所支援的能力進行檢查,首先檢查是否支援addEventListener方法,如果不支持,再檢查是否支援attachEvent方法,如果還不支持,就用dom0級的方法加入事件。這個過程,在addEvent函數每次呼叫的時候都要走一遍,其實,如果瀏覽器支援其中的一種方法,那麼他就會一直支援了,就沒有必要再進行其他分支的偵測了。也就是說,if語句不必每次都執行,程式碼可以運行的更快一些。

解決方案就是惰性載入。所謂惰性載入,指函數執行的分支只會發生一次

有兩種實現惰性載入的方式 

【1】第一種是在函數被呼叫時,再處理函數。函數在第一次呼叫時,函數會被覆寫為另一個以適當方式執行的函數,這樣任何對原函數的呼叫都不用再經過執行的分支了

我們可以用下面的方式是用惰性載入addEvent() 


function addEvent(type, element, fun) {
  if (element.addEventListener) {
    addEvent = function (type, element, fun) {
      element.addEventListener(type, fun, false);
    }
  }
  else if(element.attachEvent){
    addEvent = function (type, element, fun) {
      element.attachEvent('on' + type, fun);
    }
  }
  else{
    addEvent = function (type, element, fun) {
      element['on' + type] = fun;
    }
  }
  return addEvent(type, element, fun);
}

在這個惰性載入的addEvent()中,if語句的每個分支都會為addEvent變數賦值,有效覆蓋了原函數。最後一步便是呼叫了新賦函數。下次呼叫addEvent()時,就會直接呼叫新賦值的函數,這樣就不用再執行if語句了

但是,這種方法有個缺點,如果函數名稱有所改變,修改起來比較麻煩 

【2】第二種是宣告函數時就指定適當的函數。 這樣在第一次呼叫函數時就不會損失效能了,只在程式碼載入時會損失一點效能

以下就是依照這個想法重寫的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;
    }
  }
})();

以上是javascript函數中的惰性載入函數實例程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn