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