为便于说明,请参阅相应的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 名为。
答案 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 :(得分:0)
正如Pilot所说,你需要使用一个闭包,就像这样:
(function (crtName) {
$("#" + crtName).click(function () {
alert("Event " + crtName);
});
})(crtName);
这样,您将crtName
传递给自我调用函数,该函数使用数组中每个成员的正确事件名称执行
答案 2 :(得分:-1)
由于您使用crtName
来引用元素的ID,因此只需在事件处理程序中引用this.id