for循环中使用var和let的区别,以及加上定时器后执行出不同的效果

for循环中使用var和let的区别,以及加上定时器后执行出不同的效果?
这道题面试的时候经常被问,太闹心了,社会我x哥,是人狠话不多,直接上代码
	  // 使用var定义循环条件变量, +定时器  输出 3个3
      for (var i = 0; i < 3; i++) {
        setTimeout(() => {
          console.log(i)
        }, 0)
      }
      // 使用let定义循环条件变量, +定时器  输出 0,1,2
      for (let i = 0; i < 3; i++) {
        setTimeout(() => {
          console.log(i)
        }, 0)
      }
  • 个人总结了一波,
    • var+定时器
      首先是定时器属于异步操作,会被放在异步队列中最后执行
      但 由于i是由var 定义的 属于全局变量 , 当循环往下走时i也在不断的进行++
      当循环走完之后 i已经变为最大值了,这时才来执行定时器,
      这时定时器使用的i都属于全局变量 所以会全输出3

    • let+定时器, 因为lei定义的变量本身就是一个匿名函数自调用,生成了作用域和闭包
      当循环一次时,会生成一个匿名函数,并自调用传入当前循环条件的变量参数
      在这个匿名函数中这个变量就是唯一的,不会因为循环继续往下执行而导致i++
      在加上定时器的异步队列 就会打印0,1,2

哎呀,反正总结一句话:就是因为作用域和定时器的异步机制产生的,完活,
看都看完了不点个赞?点个关注也行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值