JavaScript系列—for循环,闭包,作用域等

博客围绕测试题展开,主要探讨了for循环中点击事件弹出结果异常的问题,指出因for循环结束后点击事件才执行,导致结果不符合预期。介绍了使用闭包解决该问题,还提及作用域链、垃圾回收机制,对比了不同变量声明方式下的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题外话 for循环

一下打印10

 

测试题

<ul>
<li>111111111111111111</li>
<li>222222222222222222</li>
<li>333333333333333333</li>
</ul>

这里写图片描述

不管点哪个li都会弹出3,因为for循环结束的时候,下面的还没有执行,只有去点的时候才会去执行,但是点的时候,for循环已经结束,所以会弹出3。

可以用闭包解决。内部函数可以调用外部函数传进来的参数i,而外部函数执行完毕也不会影响到内部函数。点哪个弹哪个。
这里写图片描述

也可以这样写,因为循环的时候i已经被驻扎在内部了,所以点击的时候取得是放在内存中的i,而不是外面的i
这里写图片描述

测试题

选A

解析:首先转换一下,看起来更清晰

首先setTimeout是一个干扰,可以转化成这个

 

首先理解一下作用域链

运行后

 

 

现在来说闭包

什么是闭包,下面f2就是一个闭包

 

首先写一个例子

 然后在页面中随便点击那个按钮发现都会打印5

其实原因是在我进行点击的时候for循环已经执行完了,onclick相当于一个异步事件。其实按下面这样写会更清晰

现在让他如何变成0,1,2,3,4呢,看下面

 

 

然后我们继续添加代码

分别点击按钮

测试题

答案是

关于垃圾回收机制。当这个作用域中所有的数据都不被调用了,那就要被垃圾回收机制收回

下面就会出现三个1

关于作用域

测试题

 

当我点击页面时,会弹出3个3

换成let

 

会出现0,1,2

测试题

测试题

如何解释上面呢,知乎这个解释的最好

测试题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值