JS深入(for循环与onclick)

前言:

1.事件绑定,setTimeout()/setInterval() 等定时调用属于异步操作。在for循环中运行会把它们放到最后运行.

2.alert(),console.log()属于同步操作


问题1.

上述代码执行后报错:"choose[i] is undefined"。请分析原因。

解释.

将for循环进行拆解


实际执行顺序

for 循环里面给 choose 的每一个元素的 onclick 事件设置为一个匿名函数,而这个函数在 for 循环阶段是还没有执行的(等到点击时才会触发 onclick 事件执行),匿名函数里面的 choose[i] 保存着对 i 的引用,注意只是保存着引用,没有把当前 i 的值直接赋值到每个 choose[i]。

随后 for 循环执行完毕,正常情况下执行完 for 循环,i 就会被垃圾回收器回收,但是这里匿名函数保存了对 i 的引用,所以 i 没有被回收,执行完 for 循环后,i = choose.length,还继续留着内存里。

而当点击后触发 onclick 事件时,被赋值给 onclick 的匿名函数被执行,这时候开始把 i 的值赋值给匿名函数,而此时 for 循环已经执行完毕,i = choose.length,choose[i] 当然是 undefined了,也就无法读取 checked 属性了。


问题2.

为什么第二段代码,结果只弹出一个5

该循环给同一元素添加了5次点击事件的绑定,但onclick方式只能为元素绑定一个点击事件,后续的绑定只会覆盖而不会追加,问题不在循环,在于事件绑定的方式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,778评论 18 399
  • 三、闭包和高阶函数 3.1 闭包 3.1.1 变量的作用域 所谓变量的作用域,就是变量的有效范围。通过作用域的划分...
    梁同学de自言自语阅读 1,494评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 一晃三年的时间,我们的爱情不知不觉经经历了三年的风风雨雨,分分合合,每每想起都是带着伤痛却又无奈的回味,我不知道...
    断桥的雨阅读 320评论 0 0
  • 每一段路只要还有不甘心就还没尽头 好的一面是永不放弃 相反的就是拿的起放的下 不属于你的又一直烦扰你的早点放手 昔...
    神奇的面条阅读 193评论 0 2