带有节点数组的Javascript闭包

带有节点数组的Javascript闭包,javascript,Javascript,我目前正在从以下一本书“javascript:the Good Parts-O'Reilly Media”学习javascript,书中说: 必须了解,内部函数可以访问外部函数的实际变量,而不是副本,以避免以下问题: // BAD EXAMPLE // Make a function that assigns event handler functions to an array of nodes the wrong way. // When you click on a node, an al

我目前正在从以下一本书“javascript:the Good Parts-O'Reilly Media”学习javascript,书中说:

必须了解,内部函数可以访问外部函数的实际变量,而不是副本,以避免以下问题:

// BAD EXAMPLE
// Make a function that assigns event handler functions to an array of nodes the
wrong way.
// When you click on a node, an alert box is supposed to display the ordinal of the
node.
// But it always displays the number of nodes instead.
var add_the_handlers = function (nodes) 
{
    var i;
    for (i = 0; i < nodes.length; i += 1) 
    {
        nodes[i].onclick = function (e) 
        {
            alert(i);
        };
    }
};
// END BAD EXAMPLE
//坏例子
//生成一个将事件处理程序函数分配给节点数组的函数
走错了路。
//当您单击某个节点时,一个警报框应该显示该节点的序号
节点。
//但它总是显示节点数。
var add__处理器=函数(节点)
{
var i;
对于(i=0;i

问题:我不明白问题是什么,如果有人能给我一个清晰的数字和结果的例子,我将不胜感激。

这里的问题是,传递给onclick的函数保留了对相同I的引用,该I在每次循环时递增。因此,当触发单击时,i已递增以匹配元素的数量。

每次循环递增时,
i
的值都会更改,并且事件处理程序将提醒
i
的当前值。因此,如果有8个元素,当循环运行完毕时,所有元素都会弹出一个值7


该示例的要点是,许多人假设,当每个处理程序最初与当前值
i
(例如0、1、2等)绑定时,它不会随着
i
的增加而改变。此示例演示了情况并非如此,事件处理程序函数始终可以访问当前值
i
,即使在绑定后也是如此。

无论您单击哪个节点,都可能重复,它将警告相同的值,等于您传入的节点数。另请参见和@AnttiHaapala nice!同样的复制品,在你几秒钟后,在没有看到你的投票的情况下被复制。@user2628157,你可能想阅读现有的问题和答案,我在几秒钟内通过搜索“javascript closure in loop”找到了你问题的答案。