资讯专栏INFORMATION COLUMN

【Javascript】探究javascript中的堆/栈/任务队列与并发模型 event loop

desdik / 2471人阅读

摘要:而函数调用结束返回时,运行时会将栈顶的调用结构弹出。并发模型与引擎是单线程的,它的并发模型基于事件循环当线程中的同步任务执行完,执行栈为空时,则从任务队列中取出异步任务进行处理。在当前的微任务没有执行完成时,是不会执行下一个宏任务的。

堆/栈/队列

在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.

如果我的文章对你有帮助,欢迎关注我的博客,JS/Python/算法系列,码不停题!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109524.html

相关文章

  • JavaScript并发模型Event Loop

    摘要:需要注意的是,定时器只是将事件插入了任务队列,必须等到当前代码执行栈执行完,主线程才会去执行它指定的回调函数。如果当前代码耗时很长,有可能要等很久,所以并没有办法保证,回调函数一定会在指定的时间执行。这也引申出的并发模型。 一、JavaScript的单线程 众所周知,JavaScript的一大特点就是单线程,但是我们有没有思考过它为什么不能是多线程的? 我们假定JavaScript有两...

    DevWiki 评论0 收藏0
  • event loop规范探究javaScript异步及浏览器更新渲染时机

    摘要:规范中定义了浏览器何时进行渲染更新,了解它有助于性能优化。结合一些资料,对上边规范给出一些理解有误请指正每个线程都有自己的。列为,列为,列为。我们都知道是单线程,渲染计算和脚本运行共用同一线程网络请求会有其他线程,导致脚本运行会阻塞渲染。 本文转自blog 转载请注明出处 异步的思考 event loops隐藏得比较深,很多人对它很陌生。但提起异步,相信每个人都知道。异步背后的靠山就是...

    13651657101 评论0 收藏0
  • 理解Event-Loop

    摘要:回调函数任务完成的时候,需要执行哪段代码来处理呢当然是回调函数了。事件处理器和回调函数类似。但是特定的事件处理器在浏览器进入异步事件驱动阶段时就会针对特定的事件注册。当事件对象返回到执行线程时,事件处理器也会同时进入执行栈中执行。 Event Loop(事件轮询)机制是一个经常把人搞晕的东东。我不敢说我完全明白,只是在此谈谈我的浅见。 事件的处理 浏览器是一个事件驱动(event-dr...

    blair 评论0 收藏0
  • 最后一次搞懂 Event Loop

    摘要:由于是单线程的,这些方法就会按顺序被排列在一个单独的地方,这个地方就是所谓执行栈。事件队列每次仅执行一个任务,在该任务执行完毕之后,再执行下一个任务。 Event Loop 是 JavaScript 异步编程的核心思想,也是前端进阶必须跨越的一关。同时,它又是面试的必考点,特别是在 Promise 出现之后,各种各样的面试题层出不穷,花样百出。这篇文章从现实生活中的例子入手,让你彻底理解 E...

    gself 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<