闭包---为何循环不是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
- 闭包---为何循环不是1到5而是5个6
- 5个迹象表明你不是敏捷而是迷你型瀑布
- spring 依赖性注入 (spring 依赖性注入(xml配置文件,填写的时候要写全,不是包,而是到类)
- DevOps不是个技术问题,而是个业务问题
- 有时成功不是个结果,而是那份寻梦的经历
- 让背景小图不是拉伸而是多个重复
- 让背景小图不是拉伸而是多个重复
- 让背景小图不是拉伸而是多个重复
- mysql按照每天分组查询数据结果排序不是从1到31而是1后接10
- [每天一个知识点]5-影响项目成败的主要问题不是技术问题而是社会学问题
- 【Calendar】为什么我的DAT_OF_MONTH输出来的不是当前月份的日期,而是5?
- 不是“想要”,而是“一定要”
- 1分钟打900个渠道包,不是梦!
- 第5章循环练习:0到49中随机选择6个不同的数。
- 9个循环5
- 世上最遥远的距离,不是生与死,而是程序到用户之间的距离
- php for 跳到下一次循环 不是跳出循环
- 软件工程--不是制造,而是创造!
- win 10系统下安装node/npm/webstrom环境遇到的问题及解决办法
- hdu1305-Immediate Decodability 字典树
- sed替换特定行的字符串
- Android在Service里面启动Activity
- SortShuffleManager方法头注释
- 闭包---为何循环不是1到5而是5个6
- 阿里云时间服务器
- 用Intellj Idea 开发express4 、jade模板,bootstrap3的《node.js开发指南》上的微博项目
- 弹框(DialogFragment)中头像凸出效果
- 使用测试工具时候如何计算设置并发数?
- C++中堆和栈的区别
- Generator 异步操作的同步化写法
- 栈实现-逆序
- unity3d基本的C#程序框架