萌新求教!闭包以及循环中创建函数十分感谢

在看JS语言精粹遇到的问题,先上代码
varadd_the_handlers=function(nodes){
vari;
for(i=0;inodes[i].onclick=function(e){
alert(i);
};
};
};
原文:add_the_handlers函数的本意是想传递给每个事件处理器一个唯一的值(i).但它未能达到目的,因为事件处理器函数绑定了变量i本身,而不是函数在构造时变量i的值.
我不是很能理解为什么是绑定了变量i本身,按我的理解理解的循环的时候是nodes[0].click=()=>alert(0);//第一次循环nodes[1].click=()=>alert(1);//第二次循环...依次类推nodes[n].click=()=>alert(n);//第n+1次循环
慕森王
浏览 222回答 2
2回答

慕田峪9158850

对于事件处理函数而言,其内部上下文中并不存在变量i,于是就会尝试沿作用域链向父级的作用域中去寻找。而在上一级,也即add_the_handlers这个函数的上下文中,找到了变量i,所以当触发事件处理函数时,会获取到add_the_handlers中的i的值。于是乎:for循环时,给若干个元素绑定了onclick处理函数,for循环结束后,此时add_the_handlers上下文中的i变量的值为nodes.length。当触发某个元素的点击事件时,获取到的i都是add_the_handlers上下文中的i,也即都会是nodes.length。

萧十郎

但是alert(i)中的i指向函数的局部变量i,是变量,当触发任何一个node的点击,alert的是i这个变量的当前值,没什么问题吧。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript