2011-02-17 31 views
3

下面提到我可以實現的事件處理程序在JavaScript中有兩種方式,我想知道是否有這兩種風格之間或在兩種情況下click_handler任何區別是一個封閉並沒有區別。我有,因爲我讀到某處封閉形成的只有混亂「返回」用於創建2個函數時形成閉包事件處理程序 - 是「迴歸」一絕

function foo() { 
    var a = 5; 

    function click_handler() { 
     a++; 
    } 
    someElement.addEventHandler('click', click_handler, false); 
} 

OR

function foo() { 
    var a = 5; 

    return function() { 
     a++; 
    } 
} 

click_handler = foo() 
someElement.addEventListener('click', click_handler, false); 

回答

2

封匿名函數。它們在功能上應該在「閉合成形」方面工作相同。你不需要返回來形成閉包。

但是......

在#1,當你調用foo(),然後你會添加一個事件偵聽器的onClick。如果你一而再,再而再次調用它,它會保持連接到onClick事件......

在#2,當你調用foo(),你只需「重新closuring」的功能。如果你一遍又一遍地調用它,它將不會重新附加到onClick事件...

而且,在#1中,如果someElement的引用已經更新,那麼當再次調用foo()時,將使用新的someElement的參考...

假設你只是想附加onClick函數一次,你不必再重新附加它,我會寫這樣的代碼...

(function() { 
    var a = 0; 
    someElement.addEventListener("click", function() { 
    a++; 
    }, false); 
})(); 

這個自動執行功能將消除將「foo」添加到全局中的需要,因爲您只使用它一次。

1

只是明確地殺死你的困惑:

關閉和return語句無關彼此,他們不以任何方式影響彼此的行爲。

閉包不是像數字,字符串或函數那樣的對象。例如,您永遠不能將閉包分配給變量。你不能返回閉包。你在第二個例子中返回的是(嚴格來說)一個函數(不是閉包),它已經關閉了變量a(因此創建了閉包)。關閉功能與您的功能並存,但您從不直接操作它們。你可以使用包含它們的函數,或者你可以改變它們的狀態(通過它們關閉的變量),但是閉包本身是一個更抽象的東西。

編輯:我意識到術語閉包和函數經常用來代替對方。將它們混合起來很容易,因爲在JavaScript中兩者之間存在1-1關係。這當然只會增加混淆:)