博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js中for循环闭包问题记录
阅读量:5294 次
发布时间:2019-06-14

本文共 696 字,大约阅读时间需要 2 分钟。

<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].οnclick=address,aImg[1]=address,aImg[2]=address的点击事件都指向同一个地址address),当点击事件触发函数时会根据address找到触发函数,由于函数中没有i的定义,所以此时它会顺着作用域链找到父级函数的i值,由于for循环不是一个块级作用域,所以其i值相当于在window.onload匿名函数中声明(在for循环结束时依然可以输出i值),所以当onclick匿名函数找到i值时它已经变成了3.

转载于:https://www.cnblogs.com/itzfz/p/5976796.html

你可能感兴趣的文章
jquery对id中含有特殊字符的转义处理
查看>>
DP学习之路(1) 01背包
查看>>
获取元素样式信息于三中获取方式的区别
查看>>
测试主要环节
查看>>
08-17工作总结
查看>>
遇麻烦,Win7+Ubuntu12.10+Archlinux12.10 +grub
查看>>
基本高精度模板
查看>>
SqlBulkCopy大批量导入数据
查看>>
Windows Workflow Foundation 入门
查看>>
chrome(谷歌浏览器)“无法从该网站添加应用、扩展程序和用户脚本”问题
查看>>
HTTP协议 (四) 缓存
查看>>
python学习之random
查看>>
使用onclick跳转到其他页面/跳转到指定url
查看>>
【转载】测试计划模板
查看>>
pandas 修改指定列中所有内容
查看>>
ubuntu18.04 复制或剪切某文件夹下的前x个文件到另一个文件夹下
查看>>
input的value中有特殊字符
查看>>
字符串压缩
查看>>
用Lua定制Redis命令
查看>>
小程序-canvas在IOS手机层级最高无法展示问题
查看>>