0

我有一个简单的事件监听器:

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 中为它设置的参数吗?换句话说,当作为事件的结果调用 run_func_with_param 时,是否会记住 param 并将其设置为正确的值?(同一事件将有多个具有不同参数的侦听器)。

注意:请不要使用 jQuery/其他库。在这种情况下,我使用的是自定义事件。

4

1 回答 1

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);
        }
    });
}
于 2013-04-14T17:01:50.843 回答