for循环里面有异步操作_面试经典setTimeout+for循环

圣诞快乐

开始吧:“读取for循环计数器的值”可谓出现频率较多的一道题。

编码如下:问输出结果???

5f662f14dae73adb67170b64e179d568.png

解答:变量i是var声明,在全局范围内有效,每一次循环i的值都发生变化,循环内异步setTimeout函数内部,console.log(i)中的i没有var定义,指向全局的i,导致运行时输出的是最后一轮i的值。结果就是每隔一秒输出一个6。如何把每次循环的i保存起来得到1,2,3,4,5

由于js是单线程,基于事件循环,非阻塞IO;插播一个知识点:"js执行顺序"

1、js执行顺序:先同步后异步

2、异步中任务队列执行顺序:先微任务队列,再宏任务队列

3、微任务队列:调用Promise中的resolve、reject

4、宏任务队列:setTimeout

解决方式一、

通过立即调用函数(IIFE)和匿名函数形成一个私有作用域(相当于闭包)

b8073256-9956-eb11-8da9-e4434bdf6706.png

这种写法叫:"命名空间" IIFE立即执行函数中的参数i作为私有变量,和每次循环得到的i是两个不同的变量。闭包中私有变量保存在内存中,等for循环执行完,随任务队列输出。

解决方式二、

通过ES6中块级作用域let

3108a1b0cdd4ebcc73f07c9c2afb1cc5.png

循环中的i是let声明的,只在本轮循环中有效,每一次循环的i都是一个新的变量,利用javascript引擎内部会记住上一循环的值,本次循环的初始值通过上一次循环计算。

格局决定一个人的高度和宽度,有格局的人能够运筹帷幄,高瞻远瞩,善于取舍,能屈能伸。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值