首页 > 代码库 > js中for循环闭包问题记录
js中for循环闭包问题记录
<script type="text/javascript">
window.onload = function(){
var aImg = document.getElementsByTagName(‘img‘);
for(var i=0;i<3;i++){
alert(i); //0,1,2
aImg[i].onclick = function(){
alert(i); //3
}
}
alert(i);//循环外值依旧为3
}
</script>
......以下内容省略.......
运行代码之后发现红色部分输出的结果不同,这是因为js每执行一条循环语句随着i的增加,在内存中会将此整个onclick匿名函数作为字符串加载进内存,循环了3次所以i值变化为0,1,2当然匿名函数作为字符串也被加载了3次(其实是函数还未被解析作为字符串存储于堆内存中,这里加载的只是它的地址值,即aImg[0].onclick=address,aImg[1]=address,aImg[2]=address的点击事件都指向同一个地址address),当点击事件触发函数时会根据address找到触发函数,由于函数中没有i的定义,所以此时它会顺着作用域链找到父级函数的i值,由于for循环不是一个块级作用域,所以其i值相当于在window.onload匿名函数中声明(在for循环结束时依然可以输出i值),所以当onclick匿名函数找到i值时它已经变成了3.
js中for循环闭包问题记录
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。