关于setTimeout异步队列

题目描述

为什么用let来声明变量就能实现输出“0、1、2、3”的效果
mark

阅读 1.4k
1 个回答

背景知识1. 涉及到let和var的作用域范围

  1. let的作用域为块级,直观的看就是 {}内,出了大括号这个变量就失效了。
  2. var的作用域为定义这个变量的函数内,如果不在函数内,他就是全局的了。

背景知识2. setTimeout为异步执行,当同步代码全部完成后,才会去执行它,本例中for循环跑完后才会依次执行各个setTimeout里的function。

过程推演:

  1. 两个for循环各创建了4个 setTimeout,他们中都被传入了变量i,等待for循环结束后开始执行。
  2. 基于背景知识1:var-for 传入的4个i在for循环结束后,所有的i都在后续循环时被重新赋值,直至最后一次,赋值为4.
    let-for 传入的4个i在{}内互不影响,后序循环不会给前面一次的循环体内的i重新赋值(因为每次循环都是独立的{}作用域),故能正常输出期望值
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题