博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Javascript】探究javascript中的堆/栈/任务队列与并发模型 event loop的关系
阅读量:7119 次
发布时间:2019-06-28

本文共 1015 字,大约阅读时间需要 3 分钟。

堆/栈/队列

在javascript中,存在调用栈 (call stack)内存堆(memory heap) ,程序中函数依次进入栈中等待执行,若执行时遇到异步方法,该异步方法会被添加到用于回调的任务队列(task queue)中,【即JavaScript执行引擎的单线程拥有一个调用栈、内存堆和一个任务队列】

调用栈 (call stack):CallStack是用来处理函数调用与返回的。特点是先进后出,每次调用一个函数,Javascript运行时会生成一个新的调用结构压入CallStack。而函数调用结束返回时,JavaScript运行时会将栈顶的调用结构弹出。由于栈的LIFO特性,每次弹出的必然是最新调用的那个函数的结构。函数调用会形成了一个堆栈帧,存放基本数据类型的变量

内存堆(memory head):引用数据类型被存放在堆中,在我们进行浅复制时,我们改变的只是引用数据类型在栈内存中的引用地址,实际上它在堆内存中的引用地址仍然没有发生变化

任务队列(task queue):javaScript 运行时包含了一个待处理的任务队列。

并发模型 与 EventLoop

javascript引擎是单线程的,它的并发模型基于Event Loop(事件循环)

当线程中的同步任务执行完,执行栈为空时,则从任务队列(task queue)中取出异步任务进行处理。这个处理过程包含了调用与这个任务相关联的函数(以及因而创建了一个初始堆栈帧)。当执行栈再次为空的时候,也就意味着该任务处理结束,从任务队列中取出下一个异步任务进行处理,不断重复,这个过程是循环不断的, 所以整个的这种运行机制又称为Event Loop(事件循环).

Task Queue 任务队列

任务队列有宏任务队列微任务队列,每次事件循环的时候,会先执行宏任务队列中的任务,然后再执行微任务队列中的任务。 在当前的微任务没有执行完成时,是不会执行下一个宏任务的。

  • 宏任务:script(全局任务), setTimeout, setInterval, setImmediate, I/O, UI rendering.
  • 微任务:process.nextTick, Promise, Object.observer, MutationObserver.

转载于:https://juejin.im/post/5cda8192f265da035e2147b5

你可能感兴趣的文章
[译]Yarn:一个新的JavaScript包管理器
查看>>
实用的IT类网站及工具大集合
查看>>
tomcat的servlet读取请求参数
查看>>
yii2项目实战之配置
查看>>
SICP Python 描述 1.5 控制
查看>>
菜鸟排查数据库异常的事
查看>>
Android Studio 3.5 Canary 12 发布
查看>>
【视频教程】微信小程序开发【一个实例】
查看>>
一看就懂的Mybatis框架入门笔记
查看>>
Rails 5.2.3 RC1 发布,Ruby Web 应用开发框架
查看>>
Redux源码分析之基本概念
查看>>
ubuntu(14.04) 网路管理
查看>>
Maven在Eclipse中的实用小技巧
查看>>
JdbcTemplate使用小结
查看>>
Gut基础入门(十)Git远程分支
查看>>
grub.conf加密
查看>>
WSFC时间分区场景实作
查看>>
linux中的邮件服务器笔记
查看>>
CCNP-18 IS-IS试验1(BSCI)
查看>>
Comet和WebSocket
查看>>