带有节点数组的Javascript闭包
我目前正在从以下一本书“javascript:the Good Parts-O'Reilly Media”学习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
// 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”找到了你问题的答案。