Javascript for循环中有多个不同的事件侦听器

Javascript for循环中有多个不同的事件侦听器,javascript,Javascript,下面的代码总是返回未定义的。为什么会这样?我希望事件侦听器使用索引字符串进行响应 谢谢 var array = ["Hey", "Hi", "Hello"]; for (var i = 0; i < array.length; i++) { var box = document.createElement("div"); box.className = "box"; box.addEventListener("click", function() { alert(ar

下面的代码总是返回未定义的。为什么会这样?我希望事件侦听器使用索引字符串进行响应

谢谢

var array = ["Hey", "Hi", "Hello"];

for (var i = 0; i < array.length; i++) {
  var box = document.createElement("div");
  box.className = "box";
  box.addEventListener("click", function() {
    alert(array[i]);
  }, false);
}
var数组=[“嗨”,“嗨”,“你好”];
对于(var i=0;i
这是经常被问到的问题。JavaScript没有块作用域。变量范围仅在调用函数时创建。因此,要将
i
的范围限定到当前循环迭代,您需要在函数调用中引用它,该函数调用也会创建处理程序

// Create a function that returns a function
function createHandler(i) {
    // The value of `i` is local to this variable scope

    // Return your handler function, which accesses the scoped `i` variable
    return function() {
        alert(array[i]);
    }
}

var数组=[“嗨”,“嗨”,“你好”];
对于(var i=0;i


我强烈建议您为此使用命名函数,而不是流行的内联函数调用。它可能更高效,函数名提供了有关函数用途的文档。

这是经常被问到的问题。JavaScript没有块作用域。变量范围仅在调用函数时创建。因此,要将
i
的范围限定到当前循环迭代,您需要在函数调用中引用它,该函数调用也会创建处理程序

// Create a function that returns a function
function createHandler(i) {
    // The value of `i` is local to this variable scope

    // Return your handler function, which accesses the scoped `i` variable
    return function() {
        alert(array[i]);
    }
}

var数组=[“嗨”,“嗨”,“你好”];
对于(var i=0;i


我强烈建议您为此使用命名函数,而不是流行的内联函数调用。它可能更高效,函数名提供了有关函数用途的文档。

您需要将单击处理程序包装在一个闭包中,以创建
i
的本地副本:

box.addEventListener("click", (function(i) { 
  return function() {
    alert(array[i]);
  }
})(i), false);


按照现在的代码方式,
i
的值是3,而
array[3]
当然是未定义的。上面创建了值为0、1、2的
i
的3个副本。

您需要将单击处理程序包装在一个闭包中,以创建
i
的本地副本:

box.addEventListener("click", (function(i) { 
  return function() {
    alert(array[i]);
  }
})(i), false);


按照现在的代码方式,
i
的值是3,而
array[3]
当然是未定义的。上面创建了3个值为0、1、2的
i
副本。

最简单的解决方案可能是:

box.addEventListener("click", alert.bind(window, array[i]), false);

但这在IE中不起作用最简单的解决方案可能是:

box.addEventListener("click", alert.bind(window, array[i]), false);
但这在iSearch中不适用于“JavaScript在循环中创建处理程序”搜索“JavaScript在循环中创建处理程序”