2013-04-14 116 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