0

我目前正在从以下书籍“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

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

4

2 回答 2

2

i每次循环增加时,值都会发生变化,并且事件处理程序将提醒当前值i是什么。所以如果有 8 个元素,当循环运行完成时,它们都会弹出一个 7 的值。

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

于 2013-08-03T16:47:27.750 回答
0

这里的问题是,您传递给 onclick 的函数保留了对相同 i 的引用,该引用在每个循环转弯时递增。因此,当点击被触发时, i 已经增加以匹配元素的数量。

于 2013-08-03T16:46:24.837 回答