静态地将变量传递给JavaScript中的函数

时间:2014-03-25 11:08:49

标签: javascript

为便于说明,请参阅相应的jsFiddle

这是我在循环中调用的代码:

var eventNames = ["click", "dblclick", "contextmenu"];
for (var i = 0; i < eventNames.length; ++i) {
    var crtName = eventNames[i];
    $("#" + crtName).click(function () {
        alert("Event " + crtName);
    });
}

当然,当调用处理程序时,crtName始终为"contextmenu",因为此时for - 循环已结束且i始终指向最高可能的价值。

注意:在当前示例中,我使用了jQuery中的click函数。在我的实际应用程序中,有另一个框架被调用来注册事件处理程序。所以这只是一个例子而且无法改变。当事件发生时,我也不能添加传递给处理程序的参数。因此,它不是一个jQuery问题。

同样,它与问题&#34; need help understanding JS code&#34;类似,除了我自己没有调用我的事件处理程序的重要事实!

基本上:我希望在处理程序注册时填充变量crtName时#&#> 39; s 名为

3 个答案:

答案 0 :(得分:2)

问题:

  

JavaScript的范围是功能级别,而不是块级别和创建   闭包只意味着封闭的范围被添加到   封闭函数的词汇环境。

     

循环终止后,函数级变量crtName具有该值   contextmenu,这就是内部函数“看到”的内容。

所以你可以做到,

var eventNames = ["click", "dblclick", "contextmenu"];

for (var i = 0; i < eventNames.length; ++i) {
    var crtName = eventNames[i];
    attach_event(crtName);
};

function attach_event(crtName) {
    $("#" + crtName).click(function () {
        alert("Event " + crtName);
    });
}

阅读有关闭包的更多信息:

  1. Javascript infamous Loop issue?
  2. Javascript closure insideloops - simple practical example
  3. How do JavaScript closures work?
  4. Fiddle

答案 1 :(得分:0)

正如Pilot所说,你需要使用一个闭包,就像这样:

(function (crtName) {
    $("#" + crtName).click(function () {
        alert("Event " + crtName);
    });
})(crtName);

这样,您将crtName传递给自我调用函数,该函数使用数组中每个成员的正确事件名称执行

答案 2 :(得分:-1)

由于您使用crtName来引用元素的ID,因此只需在事件处理程序中引用this.id