Javascript 为什么我的jQuery事件在循环中没有正确绑定?

Javascript 为什么我的jQuery事件在循环中没有正确绑定?,javascript,events,jquery,hotkeys,Javascript,Events,Jquery,Hotkeys,我正在使用jQuery热键插件将一些按键绑定到事件。我尝试将其改为绑定数组上的循环,但它不起作用 var letters = ["a","b","c"]; for (var x in letters) { var letter = letters[x]; $("el").bind('keydown', letter, function() { /*...*/ }) .bind('keyup', letter, function() { /*...*/ }

我正在使用jQuery热键插件将一些按键绑定到事件。我尝试将其改为绑定数组上的循环,但它不起作用

var letters = ["a","b","c"];
for (var x in letters)
{
    var letter = letters[x];
    $("el").bind('keydown', letter, function() { /*...*/  })
           .bind('keyup', letter, function() { /*...*/  });
}
此代码将所有事件绑定到数组中的最后一个字母(“c”),而不将任何事件绑定到其他事件。有更好的方法吗?非常感谢。

因为JavaScript使用

您希望在其自身的函数中定义字母的作用域:

var letters = ["a","b","c"];
letters.forEach(function(letter) {
    $("el").bind('keydown', letter, function() { /*...*/ } })
           .bind('keyup', letter, function() { /*...*/  });
});
var x = "Alice";

var helloAlice = (function(name) {
  return function() { alert("Hello, " + name); };
})(x);

x = "Bob";
helloAlice(); // Alerts "Hello, Alice"
你的基本上是一个小的变化

另见


根据您的评论(其中一些已被删除?),我建议以下方法:

var events = {
    a: function() {
        console.log("a is for ALPHA");
    },
    b: function() {
        console.log("b is for BRAVO");
    },
    c: function() {
        console.log("c is for CHARLIE");
    }
};
jQuery("#el").keydown(function(e) {
      var ascii = e.keyCode || e.which;
      var handler = events[String.fromCharCode(ascii).toLowerCase()];
      if(handler) {
          handler();
      }
});

jQuery
keydown
事件对用户按下的每个键都执行-传递给
bind
的第二个参数不会将其约束为仅一个键。

在这种情况下,函数体很重要。如果在函数表达式中引用任何局部变量(
x
letters
letter
,…),它们将“关闭”(谷歌闭包获取更多信息)变量,并且在调用函数表达式来处理事件时,它们将引用分配给letter的最后一个值。例如:


var x = "Alice";
var helloAlice = function() { alert("Hello, " + x); };
x = "Bob";
helloAlice(); // Alerts "Hello, Bob"
有几种方法可以解决这个问题。一种方法是使用自执行函数:

var letters = ["a","b","c"];
letters.forEach(function(letter) {
    $("el").bind('keydown', letter, function() { /*...*/ } })
           .bind('keyup', letter, function() { /*...*/  });
});
var x = "Alice";

var helloAlice = (function(name) {
  return function() { alert("Hello, " + name); };
})(x);

x = "Bob";
helloAlice(); // Alerts "Hello, Alice"

您的代码,
var letter=letters[x]不是这样工作的,因为JavaScript不支持块级范围,只支持函数级范围。这意味着在您的代码中,
字母
字母
在同一范围内(您还应该在谷歌上搜索更多信息)。

为什么会有人绑定所有这些事件侦听器?那里的表演太糟糕了。使用switch语句或包含所有函数的对象。为keyup和keydown添加一个事件处理程序。在对象中查找函数或在开关盒中查找函数。感谢您的帮助。它现在只使用一个事件侦听器;)