2012-07-06 177 views
0

我在javascript.I新手讀過與SAEF的文章,而我仍然有問題,代碼如下:
SAEF中的參數是什麼意思?

var addEvent = (function(window, document) { 
    if (document.addEventListener) { 
     return function (elem, type, callback) { 
      //if elem exist and is a single node. 
      if (elem && !elem.length || elem === window) { 
       elem.addEventListener(type, callback, false); 
      } else if (elem && elem.length) { //elem is an node of array 
       for (var i = 0; i < elem.length; i++) { 
        addEvent(elem[i], type, callback); 
       } 
      } 
     } 
    } else if (document.attachEvent) { 
     return function (elem, type, callback) { 
      //if elem exist and is a single node 
      if (elem && !elem.length || elem === window) { 
       elem.attachEvent('on'+type, 
        function() { 
         callback.call(elem, window.event); 
       }); 
      } else if (elem && elem.length){ 
       for (var i = 0; i < elem.length; i++) { 
        addEvent(elem[i], type, callback); 
       } 
      } 
     } 
    } 
})(this, document); 
我的問題是什麼呢這和文件意味着帕拉姆都是他們的?真正的參數將取代匿名函數中包含的窗口和文檔的參數?

回答

0

這是一種稱爲立即函數的JavaScript模式。它的形式如下:

(function(param1, param2, ...) { 
    /* ... function body ... */ 
}(var1, var2)); 

你是對的,它涉及創建一個匿名函數,然後用一組變量來調用它。

它允許開發人員創建沒有變量泄漏的範圍。 JavaScript只有全局和函數範圍。任何在函數體外聲明的變量都會自動在Global範圍內。

直接函數可以避免這個問題。

在這種情況下,與許多情況下一樣,immediate函數將返回包含閉包內部某些內部變量的東西。這可以保護它們,但可以保護它們的值。

在這種情況下,您將返回一個允許調用者將事件添加到HTML元素的函數。您通常會看到用於創建跨瀏覽器方法的立即函數。對直接函數的調用將執行所有瀏覽器方法嗅探,然後生成適當的跨瀏覽器方法。這意味着嗅探只能完成一次。這樣每次調用該方法時都可以避免嗅探瀏覽器。

+0

感謝您的回答,Dancrumb.I現在明白了。 – Tristan 2012-07-07 01:13:10