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

在JavaScript中静态地将变量传递给函数,javascript,Javascript,有关更简单的解释,请参见相应的 这是我在循环中调用的代码: var eventNames = ["click", "dblclick", "contextmenu"]; for (var i = 0; i < eventNames.length; ++i) { var crtName = eventNames[i]; $("#" + crtName).click(function () { alert("Event " + crtName); });

有关更简单的解释,请参见相应的

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

var eventNames = ["click", "dblclick", "contextmenu"];
for (var i = 0; i < eventNames.length; ++i) {
    var crtName = eventNames[i];
    $("#" + crtName).click(function () {
        alert("Event " + crtName);
    });
}
var eventNames=[“单击”、“dblclick”、“上下文菜单”];
对于(变量i=0;i

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

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

同样,它与问题“”类似,除了我自己没有调用我的事件处理程序这一重要事实之外


基本上:我希望在注册处理程序时填充变量
crtName
,在调用时填充变量而不是

因为您使用
crtName
引用元素的ID,所以只需在事件处理程序中引用
这个.ID
,您需要使用闭包,如下所示:

(function (crtName) {
    $("#" + crtName).click(function () {
        alert("Event " + crtName);
    });
})(crtName);
通过这种方式,您可以将
crtName
传递给一个自调用函数,该函数使用数组中每个成员的正确事件名称执行

问题: JavaScript的作用域是函数级,而不是块级,并创建 闭包只意味着将封闭范围添加到 封闭函数的词汇环境

循环终止后,函数级变量
crtName
具有
上下文菜单
,这就是内部函数“看到”的内容

所以你可以

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);
    });
}
var eventNames=[“单击”、“dblclick”、“上下文菜单”];
对于(变量i=0;i
了解有关闭包的更多信息:


  • 谢谢你的留言。正如在示例中所写的,jQuery方法仅用于简化示例代码和创建可运行的JSFIDLE。因此,这不是一个解决方案=(如果您使用变量设置事件类型,也可以考虑使用<代码> EVT.Type 获取事件类型。