首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js执行栈与事件循环简单理解

,他就被压入栈中,这很好理解,main函数执行完成必须依赖他的执行。...事件循环 所以,事件循环其实就是js代码借助与浏览器API向消息队列中丢入一些回调函数,等待执行栈放空自己的时候,把消息队列中的回调函数压入到执行栈中执行的这么一个机制。...紧接着runWhileLoopForNSeconds(3);被压入了执行栈中,是一个函数,由于js是单线程的,因此mian也好,runWhileLoopForNSeconds也好,都会在这个执行栈所在在执行上线文中孤独的执行着...('C');被压入了执行栈,然后秒执行了,此时main总算走空了,因此事件循环现在就看消息队列中有没有消息了,已看发现有,嘿,一个一个的丢出来,放到执行栈中来执行。...总结 所以,只有当执行栈中是空的时候,事件循环机制才有机会把消息队列中的任务丢出来执行,换句话说,只有执行栈中有内容在执行事件循环就不可能给你从消息队列中取任务出来执行

1.6K30

js事件循环

首先,我们来解释下事件循环是个什么东西: 就我们所知,浏览器的js是单线程的,也就是说,在同一时刻,最多也只有一个代码段在执行,可是浏览器又能很好的处理异步请求,那么到底是为什么呢?...从上图我们可以看出,js主线程它是有一个执行栈的,所有的js代码都会在执行栈里运行。...因此,这叫做事件循环。 那么,问题来了。如果任务队列中,有很多个任务的话,那么要先执行哪一个任务呢?...microtask任务会在当前事件循环周期内执行,而新增的macrotask任务只能等到下一个事件循环才能执行了(一个事件循环执行一个macrotask) 首先,我们先来看一段代码 console.log...原因:因为一开始js主线程中跑的任务就是macrotask任务,而根据事件循环的流程,一次事件循环只会执行一个macrotask任务,因此,执行完主线程的代码后,它就去从microtask队列里取队首任务来执行

18.8K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JS 事件循环

    浏览器执行线程 在解释事件循环之前首先先解释一下浏览器的执行线程: 浏览器是多进程的,浏览器每一个 tab 标签都代表一个独立的进程,其中浏览器渲染进程(浏览器内核)属于浏览器多进程中的一种,主要负责页面渲染...,脚本执行事件处理等 其包含的线程有:GUI 渲染线程(负责渲染页面,解析 HTML,CSS 构成 DOM 树)、JS 引擎线程、事件触发线程、定时器触发线程、http 请求线程等主要线程 关于执行中的线程...工作线程:也称幕后线程,这个线程可能存在于浏览器或js引擎内,与主线程是分开的,处理文件读取、网络请求等异步事件。...主线程内的任务执行完毕为空,会去任务队列读取对应的任务,推入主线程执行。 上述过程的不断重复就是我们说的 Event Loop (事件循环)。...最后的最后,记住,JavaScript 是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执行线程。

    15.4K10

    node.js 事件循环

    Node的线程会保持一个事件循环,当有任务完成时,他会触发相应的事件,通知事件监听函数执行。      事件驱动程序      node.js大量的使用事件,这也是和其他相同技术相比更快的原因。...当Node被启动时,初始他的变量,和声明方法,而后等待事件的发生。      在一个事件驱动应用程序内,一般会有一个主要的循环用于事件监听,当有一个事件被发现就会触发相应的回调函数。  ?   ...事件循环和回调(callback)特别像,他们的不同之处在于,回调函数(callback)只有在异步函数执行完后才被会被执行调用,而事件处理工作于观察者模式。...监听事件行为的函数就像观察者,当有一个事件被触发,它的监听函数就开始执行。通过内置的事件模块和EventEmitter类可以使用很多Node.js内置事件。...还有一篇讲事件循环的文章很不错,有时间 大家可以读一下: https://blog.risingstack.com/node-js-at-scale-understanding-node-js-event-loop

    3K60

    Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。...Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。...Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. ---- 事件驱动程序 Node.js 使用事件驱动模型...(这也称之为非阻塞式IO或者事件驱动IO) 在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。 整个事件驱动的流程就是这么实现的,非常简洁。...; 接下来让我们执行以上代码: $ node main.js 连接成功。 数据接收成功。 程序执行完毕。 ---- Node 应用程序是如何工作的?

    3.5K30

    JS串行和事件循环

    JS 是单线程的所以 JS 中的代码都是 串行 的, 前面没有执行完毕后面不能执行, 但是我如下的代码运行的结果并不是想前面我所说的,前面没有执行完毕后面不能执行:<!...当中的事件循环这个东西了,还要了解一下 JS 当中的同步代码和异步代码。...程序运行会从上至下依次执行所有的同步代码在执行的过程中如果遇到异步代码会将异步代码放到事件循环中当所有同步代码都执行完毕后, JS 会不断检测事件循环中的异步代码是否满足条件一旦满足条件就执行满足条件的异步代码首先来看一个事件循环的这么一个东西吧...,那么事件循环当中的异步代码就不会被执行,这就足以可以证明 JS 是单线程的了,效果可以自行运行在浏览器当中会弹出一个确认框,点击了确认之后异步代码当中的 2 才打印:图片如上的这个实例就至于验证我如上所说的那几点都是正确的...,在所有同步代码执行完毕之后 JS 会去不断的去事件循环当中判断有没有满足条件的异步代码然后进行执行异步代码当中的内容。

    16500

    Node.js事件循环

    介绍 事件循环是了解 Node.js 最重要的方面之一。 为什么这么重要?...Web 工作进程也运行在自己的事件循环中。 主要需要关心代码会在单个事件循环上运行,并且在编写代码时牢记这一点,以避免阻塞它。...阻塞事件循环 任何花费太长时间才能将控制权返回给事件循环的 JavaScript 代码,都会阻塞页面中任何 JavaScript 代码的执行,甚至阻塞 UI 线程,并且用户无法单击浏览、滚动页面等。...事件循环不断地检查调用堆栈,以查看是否需要运行任何函数。 当执行时,它会将找到的所有函数调用添加到调用堆栈中,并按顺序执行每个函数。 你知道在调试器或浏览器控制台中可能熟悉的错误堆栈跟踪吗?...此时,调用堆栈如下所示: 每次迭代中的事件循环都会查看调用堆栈中是否有东西并执行它直到调用堆栈为空: 入队函数执行 上面的示例看起来很正常,没有什么特别的:JavaScript 查找要执行的东西,并按顺序运行它们

    2.7K20

    JS事件循环机制(Event Loops)

    其实,在 JavaScript 中,代码的执行顺序并不是完全按照它们的书写顺序,而是取决于它们在 **事件循环** 中的顺序。 2. **什么是事件循环?...** 事件循环,即 Event Loops。用于协调事件、用户交互、JavaScript 脚本、DOM 渲染、网络请求等等的执行顺序问题。...一个遵循 ECMAScript 标准的代理(浏览器或 JS 引擎)也必须遵循事件循环机制。 事件循环是由一个或以上的 **任务队列** 组成的。 3. **什么是任务队列?...就是需要等待被通知才以执行的任务。也就是说,它们不会直接进入主线程执行,而是进入到微任务队列或下一次事件循环中的任务队列进行等待。...) * `` 由于当前任务队列已经处于执行状态,所以任务队列中遇到的宏任务将进入到下一次事件循环的任务队列,而微任务则会被放入到本次事件循环的微任务队列中。

    1.5K10

    Node.js 事件循环完整指南

    事件循环 现在我们已经对线程如何工作有了基本的了解,接下来解决 Node.js 事件循环逻辑。通过本文,你将了解前面那些解释背后的原因,每一条都会对应到正确的位置上。...这个线程是整个代码唯一执行的地方。在其中生成了一个被称为事件循环的东西。这个循环的作用是安排我们唯一的线程应该在什么时间点执行哪些操作。 详细的说明 现在让我们尝试模拟事件循环的工作原理及其工作方式。...Node.js 事件循环的说明 步骤1:performChecks 不应该单纯的认为事件循环实际上是一个循环。它有一个特定的条件,用来确定循环是否需要再次迭代。...事件循环的每次迭代都被称为一个 tick。 事件循环执行 tick 的条件是什么? 每当执行程序时,我们都会进行一系列需要执行的操作。...第5阶段: 管理关闭事件,用于清理程序状态。 关于事件循环的常见问题和错误观点 Node.js 是完全单线程的吗? 这是对 Node.js 的一种非常普遍的误解。

    1.5K30

    深入 Node.js 事件循环架构

    关于 Node.js ,相信你已经了解过不少内容,诸如 Node.js 内核、事件循环、单线程、setTimeout 或 setImmediate 函数的执行机制等等。...当然最重要的,你应该知道 Node.js 使用的是非阻塞 IO 模型以及异步的编程风格。本文仍将深入核心进行相关内容的探讨。 01 — 事件循环到底是什么?Node.js 到底是单线程还是多线程?...实际上,Node.js 基于 V8 引擎,代码在主线程中执行事件循环也运行在主线程中,这就是为什么我们说 Node.js 是单线程的。...但是如果你执行一些异步的任务,它不会总是在主线程中执行:根据你使用的方法,事件循环可以将它路由到 APIs 中的某一个,并且它可以在另一个线程中执行。...这就是 Node.js 中的异步工作方式,以及为什么我们称之为事件驱动。事件循环允许 Node.js 执行非阻塞 IO 操作。

    1.7K20

    nodejs中事件循环中的执行顺序

    nodejs 事件循环是一个典型的生产者/消费者模型,异步 I/O、网络请求等是事件的生产者,源源不断为 Node 提供不同类型的事件,这些事件被传递到对应的观察者那里,事件循环则从观察者那里取出事件并处理...事件循环、观察者、请求对象、I/O 线程池共同构成了 Node 异步 I/O 模型的基本要素。...Node 异步 I/O 几个关键词:单线程、事件循环、观察者、I/O 线程池,JavaScript 是单线程,node自身是多线程,只是 I/O 线程使用的 CPU 较少。...// start // Promise-1 // 在每轮循环中,会将 process.nextTick 全部执行完,优先级> promise.then // process.nextTick-1 /...setTimeout-2 // setTimeout-2-Promise // setTimeout-2-process.nextTick // setTimeout-2-Promise-then // 一次循环执行一个

    1.8K30

    有效使用 Node.js 事件循环

    对于 Node.js 应用程序开发新手而言,作为学习曲线的一部分,他们需要了解单线程事件循环的工作原理,以及它可能导致意外结果的方式。您可以使用本教程中的 3 个交互式示例中的事件循环进行练习。...我们将通过 3 段简单的代码段来演示事件循环的工作原理。 示例 1:一个简单示例 第一个示例定义了 3 个函数并调用了它们。单运行该代码。...事件循环的工作原理 传统 Web 服务器是多线程的,每个会话通常都有自己的线程。该方法很有效,但当会话空闲时,它会要求 Web 服务器分配未被使用的资源。...在此期间,Node 事件循环会前进到需要执行的下一个操作。 您需要了解,Node 引擎会立即处理每个操作。在一些情况下,“立即” 意味着要求操作系统在某个操作准备好处理时获知此事。...结束语 我们快速查看了如何使用 Node.js 单线程事件循环。使用 Node 库来访问数据库和文件等对象时,了解如何处理异步方法 — 和如何确保代码按一定的顺序执行 — 是至关重要的技能。

    1.6K20

    深入理解JS事件循环

    ,也就是事件循环,在这个过程中你就能明白为什么需要这些规则。...有了规则JS世界才能稳稳的运转起来,所以这些规则非常重要,但是你真的了解它们了吗? 阅读本文前可以思考下面几个问题: 你理解中的事件循环是怎样的? 有宏任务了,为什么还要有微任务,它们又有什么关系?...本文将会由浅入深的解答这些问题 深入理解JS系列 第一节:深入理解JS的深拷贝 第二节:深入理解JS的原型和原型链 第三节:深入理解JS事件循环 万物初始 ★本文基于chromium内核讲解 ” 刚开始让万物运转是件挺容易的事情...现在的JS事件循环系统就能持续运转起来啦: 循环机制解决了不能循环执行的问题:引入了循环机制,通过一个 while 循环语句,线程会一直循环执行 不过又有其他问题出现了: 别的线程要交给我这个主线程任务...从底层看setTimeout实现 到现在已经知道了,JS世界是由事件循环和任务队列来驱动的。 setTimeout大家都很熟悉,它是一个定时器,用来指定某个函数在多少毫秒后执行

    4K60

    ajax 和 js 事件执行顺序

    有一个需求,滚轮滚动到相应位置的时候执行当前的动画,这个动画在footer里面,而网页的主体通过ajax进行渲染,我在js里面调用ajax渲染数据,然后再获取主体的高度,滚动到该高度的时候执行动画。...我大致想了两种解决办法,均以失败告终,本地是ajax先执行,服务器是js执行。...让获取高度的事件时间延时500ms,发现最后获取不到事件了; 将该事件写在ajax的success回调里面,结果是只有打开网页第一次能够成功,然后不管刷新多少次均无效,事件被屏蔽,所以方法二也被废除;...最后我想到了,ajax不就是一种异步方法,我将其改为同步不就行,先让ajax执行完在执行js事件。...当然这样做有弊端的,如果接口出问题,ajax渲染失败,那么整个网页的js都将执行不了。不过我想真到了数据都渲染不出的地方,访问网页就没有意义了,所以最后我采用了这种方法。

    2.9K30
    领券