有一个经典例子:

for (var i = 0; i < 10; i++) {setTimeout(function() { console.log(i); }, 100 * i);
}

介绍一下,setTimeout会在若干毫秒的延时后执行一个函数(等待其它代码执行完毕)。

好吧,看一下结果:

10
10
10
10
10
10
10
10
10
10

很多JavaScript程序员对这种行为已经很熟悉了,但如果你很不解,你并不是一个人。 大多数人期望输出结果是这样:

0
1
2
3
4
5
6
7
8
9

实际上,我们传给setTimeout的每一个函数表达式实际上都引用了相同作用域里的同一个i。
让我们花点时间思考一下这是为什么。 setTimeout在若干毫秒后执行一个函数,并且是在for循环结束后。 for循环结束后,i的值为10。 所以当函数被调用的时候,它会打印出 10!

一个通常的解决方法是使用立即执行的函数表达式(IIFE)来捕获每次迭代时i的值:

for (var i = 0; i < 10; i++) {// capture the current state of 'i'// by invoking a function with its current value(function(i) {setTimeout(function() { console.log(i); }, 100 * i);})(i);
}

这种奇怪的形式我们已经司空见惯了。 参数 i会覆盖for循环里的i,但是因为我们起了同样的名字,所以我们不用怎么改for循环体里的代码。

这是参考:https://www.tslang.cn/docs/handbook/variable-declarations.html
这里就要问明明写在里面的,为什么还是要用立即执行函数的写法才能让他真的符合看上去那样在for循环里面乖乖执行每次获取不同的 i 呢。

JS的异步执行顺序是:
先同步后异步

异步任务队列的执行顺序是:
先微任务microtask队列,再宏任务macrotask队列

微任务包括 process.nextTick ,promise ,MutationObserver。
宏任务包括 script , setTimeout ,setInterval ,setImmediate ,I/O ,UI rendering。

所以是settimeout()开启了宏任务,在for循环这个同步结构执行结束之后,获取到了i ,程序结构上是嵌套在for里面的,仍然会有10个宏任务生成,但是此时的 i 变量已经是for结束之后的 i=10 了。

javascript的异步执行顺序---管中窥豹相关推荐

  1. 异步执行顺序——宏任务与微任务不同环境下的出队规则

    导读 javascript是一门单线程语言,一切javascript版的多线程都是用单线程模拟出来的,所以代码执行还是顺序执行的原则,只不过编写的顺序被执行环境重新"编排"了一下而 ...

  2. php 内部异步执行顺序,event_loop中不同异步操作的执行顺序

    关于js的单线程.怎么创建一个异步任务都是老生常谈的话题了,我们今天就总结一下js不同的异步操作到底执行顺序如何. 首先我们要明白js两种任务类型,一个是macrotask(宏任务),一个是 micr ...

  3. JavaScript:异步执行机制

    使用JavaScript的开发者都知道,JS的异步执行机制在JS中占据着重要的地位,主要就是体现在回调函数以及事件方面,最近看了很多文章,将自己的一些感受和理解跟各位分享一下. 前面的博客中也有提到, ...

  4. Ajax同步异步执行顺序问题

    今天项目中碰到一个问题,大概是这样的:JS中一个方法A需要先给隐藏域赋值,然后另一个方法B再从这个隐藏域取值,获取到这个值后给接口传参然后请求数据.也就是说这两个方法需要有执行顺序,A方法先执行,然后 ...

  5. javascript tyy的执行顺序很怪异

    <script type="text/javascript"> function Test() {     try {         return "函数R ...

  6. 了解javascript中函数执行顺序

    我个人觉得一般人不会有这种写法,但艺不压身,呵呵.希望能帮到初学的朋友!大家一起进步! 首先列举出8个例子,然后例子的解答会在文章末尾贴出! 测试代码一: <script language=&q ...

  7. C# async/awit 嵌套异步 执行顺序 分析

    使用非异步方法调用可异步方法(内含嵌套异步) 效果图: 代码(在控制台mian函数中运行该函数): private static void AsyncTest(){Func<Task<st ...

  8. react学习(50)--解决异步执行顺序问题

    this.props.dispatch({type: 'activity/addActivityPopup',payload: params,callback: (res) => {if (re ...

  9. JavaScript的预编译及执行顺序

    从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序. 如果说,JavaScript引擎的工作机制比较深奥是 ...

最新文章

  1. 【spring框架】spring整合hibernate初步
  2. 到时间就站起来!用树莓派爆改升降办公桌,懒癌有救了
  3. Python+Django+Eclipse 在Windows快速Blog
  4. C语言详解 - 数组
  5. 常用抓包工具(可编程抓包工具)
  6. 【MFC】状态栏随对话框的改变而改变
  7. java中创建对象的方式有哪些,Java中创建对象的四种方式
  8. Q106:Linux系统下安装编译PBRT-V3
  9. 15.6. Plugin Hook 设计与实现
  10. python卷积函数_Convolution卷积算法python以numpy,Matplotlib实现
  11. Centos6.5之yum安装LAMP+wordpress
  12. 【Excel】字符串截取、去重复行
  13. VB6各类源码开源 - 开源研究系列文章
  14. TFWmodi-修改tfw文件
  15. 上升了百分之几怎么算_如何简单计算同期上升下降的百分比?
  16. Android 完美解决9.0的机型,必须请求GPS权限并打开GPS才可以正确获取到WIFI名称
  17. 程序员面试需要刷力扣算法题吗
  18. ClassLoader和ClassForname的区别(详解)
  19. 4个基本不等式的公式高中_基本不等式公式四个叫什么名字
  20. 北上广深飘的程序员的巨大bug

热门文章

  1. [NOIP2013][逆序对]火柴排队
  2. C语言代码规范(二)空格
  3. 抨击世俗:为什么文凭打不倒唐骏
  4. socket仿qq聊天工具(一)(扩展博客)
  5. mysql revoke 授权,MySQL授权(grant)和撤销授权(revoke)的简单示例
  6. VS2017下使用CMake配置opencv3.4.0
  7. magix中的2种事件绑定方式
  8. 解决Clock skew detected
  9. ps6-工具的基础使用
  10. 没签订书面合同,怎样证明买卖关系是存在的?