2013-04-14 144 views
0

我有一個簡單的事件偵聽器:的JavaScript事件監聽PARAM

function listen(evnt, elem, func) { 
    if (elem.addEventListener) // W3C DOM 
     elem.addEventListener(evnt,func,false); 
    else if (elem.attachEvent) { // IE DOM 
     var r = elem.attachEvent("on"+evnt, func); 
    return r; 
    } 
    return false; 
} 

我想用一個參數設置監聽器。 (參數未通過事件將,它是特定聽衆的一部分

我做什麼,似乎工作是:

function setlistener (param){ 

listen ('custom event', document, 
    function (e){ 
    run_func_with_param(param); 
    } 
); 
} 

但我不因爲參數是不應該明白,如果它的正確當事件被觸發時被定義

我的問題是 - 是否有正確的方法來調用run_func_with_param,每次都在setlistener中爲它設置params?換句話說,param是否會被記住並且將被設置當run_func_with_param將作爲一個事件的結果被調用時,它的值是否爲正確值?(將有多個不同的參數用於t他同樣的事件)。

注意:請不要使用jQuery /其他庫。 我在這種情況下使用自定義事件。

+0

我想** ** PARAM時,它的發射將是可行的每個事件。它被稱爲封閉。最好解釋[這裏](http://stackoverflow.com/questions/12930272/javascript-closures-vs-anonymous-functions) – Ikrom

回答

1

當您使用匿名函數時,來自父範圍的參數和局部變量在匿名函數中仍然可用。

因此,您的名爲param的參數在傳遞給listen()的匿名函數中可用。它不會傳遞給該函數 - 它只是直接從父範圍提供。

下面是在評論一些註釋你的函數:

function setlistener (param){ 
    // param is available here as an argument to setlistener 
    // as a normal function argument 
    listen ('custom event', document, function (e) { 
     // param is still available here directly from the parent scope 
     //  in this anonymous function. 
     // This is one advantage of using anonymous functions. 
     if (e.data.back_button==false){ 
      run_func_with_param(param); 
     } 
    }); 
} 
+0

對不起,但有一些我不明白。假設我調用setlistener(1),然後我調用setlistener(2)。 JS是否保留anonymouse函數的兩個實例,每個都有聲明時存在的父範圍? – Nir

+0

@Nir - 是的,JavaScript保持每個範圍分開,並在其中的所有變量。它被稱爲「封閉」。因此,每次調用'setlistener()'都會自己保存自己的作用域,並保存它自己的'param'副本,只要仍然有可能調用匿名函數回調函數,閉包/作用域就會存在。 – jfriend00

+0

謝謝jfriend00。那就是我正在尋找的。 :-) – Nir