JavaScript语言本身是单线程的,所以它自身不可能是异步。所谓单线程,就必然意味着:所有任务需要排队,前一个任务结束,才会执行后一个任务。

但js的宿主环境(比如浏览器,Node)是多线程的。宿主环境通过【事件驱动】机制使得js具备了异步的属性。浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行。

浏览器会给网络请求,定时器和事件监听等耗时的任务分配笼另外的线程,这些任务是异步的。异步任务完成后主线程怎么知道的?因为js是基于事件驱动的,每个事件都可以绑定相应的回到函数。可以通过回调函数来通知主线程,回调函数执行时,被放到任务队列里,做单线程处理。

综上所术:JS一直是单线程,用任务队列的方式处理任务。实现异步的是宿主环境浏览器。

JS从程序运营开始,一直在做一个工作,就是从任务队列里提取任务,放到主线程里执行。

堆(heap)和栈(stack)共同组成了js主线程,函数的执行就是通过进栈和出栈实现的,比如图中有一个foo()函数,主线程把它推入栈中,在执行函数体时,发现还需要执行上面的那几个函数,所以又把这几个函数推入栈中,等到函数执行完,就让函数出栈。等到stack清空时,说明一个任务已经执行完了,这时就会从callback queue中寻找下一个人任务推入栈中(这个寻找的过程,叫做event loop,因为它总是循环的查找任务队列里是否还有任务)。

浏览器的机制规定界面渲染线程和主线程是互斥的,主线程执行任务时,浏览器渲染线程处于挂起状态

参考文章:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop

https://www.cnblogs.com/woodyblog/p/6061671.html

https://zhuanlan.zhihu.com/p/23659122?refer=dreawer

http://www.ruanyifeng.com/blog/2014/10/event-loop.html

最新文章

  1. Copy 与MutableCopy的区别
  2. thinkphp一句话疑难解决笔记 2
  3. 当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
  4. CSS换行文本溢出显示省略号
  5. Java_Java中动态加载jar文件和class文件
  6. Aspose.Cells 设置背景颜色
  7. 单源最短路径算法---Dijkstra
  8. js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( )) 有区别?
  9. synchronized 用法,实例讲解
  10. Ice_cream's world I--hdu2120
  11. 列求key出现的频率
  12. ArduinoYun教程之配置Arduino Yun环境
  13. Lua面向对象设计(转)
  14. php回传ajax数据
  15. WPF项目学习.四
  16. Java基础2:基本数据类型与常量池
  17. Android为TV端助力 播放视频卡顿问题
  18. oracle(环境搭建一)
  19. datetime.timedelta类
  20. 解决PowerDesigner 16 Generate Datebase For Sql2005/2008 对象名sysproperties无效的问题

热门文章

  1. jQuery属性遍历、HTML操作
  2. socketserver 多进程、多线程应用实例
  3. APP支付宝登录--PHP处理代码
  4. .npmrc 实用小技巧
  5. java基础:多态过程中的动态绑定
  6. Spring-Spring配置-依赖注入
  7. Vue -- element-ui el-table 点击tr项页面跳转,返回后缓存回显点击项
  8. vue1 动态组件
  9. 使用selenium实现站长素材图片采集
  10. 帝国CMS 7.2-插件包整合