【问题标题】:Very simple Javascript loop to create event listeners, returning undefined? [duplicate]非常简单的 Javascript 循环来创建事件监听器,返回未定义? [复制]
【发布时间】:2013-08-31 15:46:28
【问题描述】:

我有一个城市列表,当我点击一个链接时,我想运行一些特定的 Javascript。 JSfiddle在这里:http://jsfiddle.net/uWYRW/5/

var cities = [
    ["new-york", 45, 90, 15]
    ["london", 20, 30, 15]
];

for (i = 0, length = cities.length; i < length; i++) {
    $("#"+cities[i][0]).click(function (e) {
        e.preventDefault();
        console.log(cities[i][0])
    });
}

但是,我收到了错误:

“未定义”不是一个对象。

有人能解释一下问题出在哪里吗?

【问题讨论】:

  • 哪一行出错了?
  • console.log(cities.length, i) 添加到您的点击处理程序中,您将看到问题

标签: javascript jquery loops jquery-events


【解决方案1】:

试试 IIFE(立即调用的函数表达式):

for (i = 0, length = cities.length; i < length; i++) {
    (function(i) {
        $("#"+cities[i][0]).click(function (e) {
            e.preventDefault();
            console.log(cities[i][0])
        });
    })(i);
}

这是因为一旦循环完成,对于所有 click 侦听器,i 的值将是 cities.length

另外,您的二维数组中缺少逗号。

【讨论】:

    【解决方案2】:
    var cities = [
        ["new-york", 45, 90, 15], // <-- that comma was missing
        ["london", 20, 30, 15]
    ];
    

    请注意您忘记在数组中分隔的逗号 :)

    【讨论】:

    • 这并不能解决问题。
    • 三票赞成不能解决问题的答案。幸运的你!仅供参考,如果 OP 在其实际代码中缺少注释,它甚至不会运行但会引发语法错误。由于看起来代码确实运行,因此逗号必须在 OP 的真实代码中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多