闭包---为何循环不是1到5而是5个6

在学习闭包的时候看到这么一个问题,被绕晕了,然后尝试理解下

(问题和答案出自《你不知的JavaScript》)

我只是记录下自己的理解过程,以后再查漏补缺


这里预想是每秒输出一次,输出1到5

但是结果是每秒输出一次,输出5次6


为什么呢?

下面是我不知道对不对的理解


由于setTimeout函数中的回调函数time()是闭包,因此在这几次循环中没有为每一次循环分配一个属于自己的i,因为他们属于同一个作用域,所以是在共用同一个i;

另外回调函数time()在循环结束后才执行(关于什么是回调函数https://www.zhihu.com/question/19801131)


关于为什么回调函数在for()结束后才执行

因此在for循环结束后i=6,在回调函数中有5个等待执行的函数

分别是setTimeout(function time(){ console.log(i)}, 1000) ,setTimeout(function time(){console.log(i)}, 2000)....setTimeout(function(){console.log(i)}, 5000)

而它们在同一个作用域,此时i=6

因此会每秒输出一次,输出5次6


书上的解决办法:

解决的关键在于问题的根源,只要为每次回调函数创建一个属于自己的作用域,并将i赋值给j

因此即使循环结束后i=6,但是每个回掉函数不在用同一个作用于的i作为输出,而是拥有在自己作用域内每次循环生成的时候声明的变量j


希望以后再回来看到这篇小记录的时候不会找到太多的错误哈哈哈哈哈哈~


书上还有个更酷的解决办法


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值