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

来源:互联网 发布:含视黄醇的护肤品知乎 编辑:程序博客网 时间:2024/05/29 15:45

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

(问题和答案出自《你不知的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
原创粉丝点击