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

JS串行和事件循环

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

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

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

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

    1.6K30

    js事件循环

    首先,我们来解释下事件循环是个什么东西: 就我们所知,浏览器的js是单线程的,也就是说,在同一时刻,最多也只有一个代码段在执行,可是浏览器又能很好的处理异步请求,那么到底是为什么呢?...microtask任务会在当前事件循环周期内执行,而新增的macrotask任务只能等到下一个事件循环才能执行了(一个事件循环只执行一个macrotask) 首先,我们先来看一段代码 console.log...我在node环境和chrome控制台输出的结果如下: 1 9 7 8 2 3 10 11 12 13 在上面的例子中 第一次事件循环: console.log(1)被执行,输出1 settimeout1...队列 console.log(9)执行,输出9 根据事件循环的定义,接下来会执行新增的microtask任务,按照进入队列的顺序,执行console.log(7)和console.log(8),输出7和...原因:因为一开始js主线程中跑的任务就是macrotask任务,而根据事件循环的流程,一次事件循环只会执行一个macrotask任务,因此,执行完主线程的代码后,它就去从microtask队列里取队首任务来执行

    18.9K41

    JS 事件循环

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

    15.5K10

    从 Promise 对象讲解事件循环机制

    我们知道 ES6 出现之后,事件循环机制和之前的就有些不同,这篇文章会讲这些不同的地方讲清楚。 我们先从浏览器的进程讲起! 浏览器进程 下面来看看浏览器都有哪些进程: ?...所谓的 JS 异步并不是交由 JS 引擎去完成的,而是交给浏览器的其他线程去完成。JS 异步操作还会涉及到 JS 事件循环机制。 JS事件循环机制 下图就是JS事件循环机制的一个执行流程: ?...所谓的 JS 事件循环机制其实可以这么理解,当 JS 引擎去执行 JS 代码的时候会从上至下按顺序执行,当遇到异步任务的,就会交由浏览器的其他线程去执行,如果是setTimeout/setInterval...这就是所谓的 JS 事件循环。 那什么是宏任务?什么是微任务呢? 宏任务与微任务 下面的图会很清楚的告诉大家什么是宏任务及微任务: ? 我们发现今天要讲的 Promise 其实就是一个异步的微任务。...后面就是再从任务队列中取出下一个宏任务来继续执行,以此类推。 Promise Promise简介 Promise 是异步编程的一种解决方案,比传统的解决方案 (回调函数和事件)更合理和更强大。

    1.9K30

    ajax 和 js 事件的执行顺序

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

    2.9K30

    JS的线程模型和事件循环机制

    线程模型和事件循环 JavaScript 的执行环境(如浏览器或 Node.js)是单线程的,这意味着在任何给定的时间点,只有一个线程在执行 JavaScript 代码。...为了管理并发操作,JavaScript 依赖于事件循环(Event Loop)。 事件循环 事件循环是一个不断检查和处理消息队列的机制。...宏任务和微任务 在事件循环中,有两种类型的任务:宏任务(Macro Task)和微任务(Micro Task)。...当定时器到期时,回调函数会被添加到事件队列中等待执行。 事件循环与渲染 浏览器的事件循环还包括了渲染步骤。在每个事件循环迭代中,浏览器会在处理任务之前进行渲染更新。...利用 setTimeout 和 Promise,可以在不阻塞主线程的情况下实现延迟执行,从而保证用户界面依然响应迅速。

    8910

    浅析 JS 事件循环之 Microtask 和 Macrotask

    简介 我们在上一篇 《浅析 JS 中的EventLoop 事件循环》 中提到一个 Event Queue,其实在事件循环中 queue 一共有两种,还有一种叫 Job Queue 其中 Event Queue...,但是由于和 V8 中的实现比较相似,所以一般都称为 Microtask Queue Macrotask Macrotasks 包含了解析 HTML、生成 DOM、执行主线程 JS 代码和其他事件如 页面加载...、输入、网络事件、定时器事件等。...,Macrotask Queue 清空 程序执行完成 所以打印顺序为: script start -> script end -> promise1 -> promise2 -> setTimeout...Microtask 相比 Macrotask 具有更高的优先级 Macrotask 总是在 JS 代码执行完成并且 Microtask Queue 清空之后执行 JS 代码执行本身也是一个 Macrotask

    1.7K30

    JS 事件循环、微任务和宏任务

    JS 中的异步任务分为宏任务 (macro task) 和微任务 (micro task) ,只有宏任务会进行事件循环。 事件循环 JS 是单线程执行的,所有 JS 代码都要放在主线程中运行。...事件循环描述了 JS 的运行机制,也就是同步和异步任务的执行过程。...虽然上面说到异步处理线程,但它和 JS 的执行无关。...监听对象的变化,已废弃) 宏任务,依赖浏览器等宿主环境; 微任务,在 JS 引擎中执行,不会造成阻塞,也不参与事件循环。...在处理微任务和宏任务互相包含的情况,记住两点: 微任务不参与事件循环,微任务会被推到当前循环对应的微任务队列中,即使是微任务中的微任务。 宏任务将开启新的事件循环。

    1.4K20

    js事件循环机制和优先级

    浏览器的渲染进程是多线程,包括 GUI渲染线程 js引擎线程 事件触发线程 定时器触发线程 异步http请求线程 主执行栈和任务队列 所有的任务可以分为同步任务和异步任务,同步任务,顾名思义,就是立即执行的任务...主线程内的任务执行完毕为空,会去 Event Queue 读取对应的任务,推入主线程执行。 上述过程的不断重复就是我们说的 Event Loop (事件循环)。...宏任务与微任务 从任务层面,在JS引擎中,我们可以按性质把任务分为两类,macrotask(宏任务)和 microtask(微任务)。...microtask主要包含:Promise.then、MutaionObserver、process.nextTick(Node.js 环境) 它们的执行顺序如下: 在事件循环中,每进行一次循环操作称为...后面的代码,Promise.then里面的代码也属于微任务) JS引擎首先从macrotask queue中取出第一个任务,执行完毕后,将microtask queue中的所有任务取出,按顺序全部执行;

    1.5K20

    JS 事件循环 Node 篇

    JS 事件循环 Node 篇 之前介绍过浏览器中的事件循环,本文将详细介绍 Node 中的事件循环。...根据 Node.js 官方介绍,每次事件循环都包含了6个阶段,如下图所示 image-20220404145555012 「注意」:每个框被称为事件循环机制的一个阶段。...浏览器端 而在Node.js中,microtask会在事件循环的各个阶段之间执行,也就是一个阶段执行完毕,就会去执行microtask队列的任务。...,不同于setTimeout和setInterval,setlmmediate并不接受一个时间作为参数,setlmmediate的事件会在当前事件循环的结尾触发,对应的回调方法会在当前事件循环末尾「check...总结 Node.js 的事件循环分为6个阶段 浏览器和Node 环境下,microtask任务队列的执行时机不同 Node.js中,microtask 在事件循环的各个阶段之间执行 浏览器端,microtask

    2.3K10

    node.js 事件循环

    node.js是单线程的应用程序,但是他可能通过event和callback来支持并发。所有的node.js都是单线程的,也是异步的,他们使用调用异步函数来维持高并发。Node使用观察者模式。...Node的线程会保持一个事件循环,当有任务完成时,他会触发相应的事件,通知事件监听函数执行。      事件驱动程序      node.js大量的使用事件,这也是和其他相同技术相比更快的原因。...事件循环和回调(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 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. ---- 事件驱动程序 Node.js 使用事件驱动模型...(这也称之为非阻塞式IO或者事件驱动IO) 在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。 整个事件驱动的流程就是这么实现的,非常简洁。...Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例: // 引入 events 模块 var events =...; 接下来让我们执行以上代码: $ node main.js 连接成功。 数据接收成功。 程序执行完毕。 ---- Node 应用程序是如何工作的?

    3.5K30

    Node.js 回调函数和事件循环

    1. node.js 回调函数 node.js 的异步编程思想最直接的体现就是回调,在node中大量使用了回调函数,所有的API都支持回调函数,回调函数一般作为最后一个参数出现,正因为这样node在执行代码的时候就没有阻塞或者等待的操作...总结 阻塞是按顺序执行的,而非阻塞是不需要按照顺序的,需要处理的事件就写在回调函数之内即可。...node.js 事件循环 node.js 是单进程单线程应用程序,但是因为V8引擎提供的异步执行回调接口,通过这些接口可以处理大量并发,所以性能非常高,在nodejs中所有的事件机制都是用设计模式中观察者模式实现...node.js 单线程进入一个 while 的事件循环,知道没有事件观察者退出,每个异步事件都生成一个事件观察者,如果事件发生就调用该回调函数 node.js 事件驱动程序 node.js 使用事件驱动模型...node.js 的事件驱动扩展性非常强,因为web server一直在接受请求,而不进行任何等待操作,效率非常的高。

    3K30

    JS事件循环之宏任务和微任务

    众所周知,JS 是一门单线程语言,可是浏览器又能很好的处理异步请求,那么到底是为什么呢? JS 的执行环境一般是浏览器和 Node.js,两者稍有不同,这里只讨论浏览器环境下的情况。...以上不断重复的过程就叫做 Event Loop(事件循环)。 每一次的循环操作被称为tick。 ?...最后的最后,记住,JavaScript 是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执行线程。 #参考 知乎-【JS】深入理解事件循环,这一篇就够了!...(必看) 掘金小册-前端性能优化-Event Loop 与异步更新策略 Segmentfault-译文:JS 事件循环机制(event loop)之宏任务、微任务 现代JavaScript-事件循环 这一次...,彻底弄懂 JavaScript 执行机制 面试一定会问到的-js 事件循环 我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

    1.2K10

    Node.js的事件循环

    介绍 事件循环是了解 Node.js 最重要的方面之一。 为什么这么重要?...阻塞事件循环 任何花费太长时间才能将控制权返回给事件循环的 JavaScript 代码,都会阻塞页面中任何 JavaScript 代码的执行,甚至阻塞 UI 线程,并且用户无法单击浏览、滚动页面等。...被阻塞是个异常,这就是 JavaScript 如此之多基于回调(最近越来越多基于 promise 和 async/await)的原因。 调用堆栈 调用堆栈是一个 LIFO 队列(后进先出)。...事件循环不断地检查调用堆栈,以查看是否需要运行任何函数。 当执行时,它会将找到的所有函数调用添加到调用堆栈中,并按顺序执行每个函数。 你知道在调试器或浏览器控制台中可能熟悉的错误堆栈跟踪吗?...此时,调用堆栈如下所示: 每次迭代中的事件循环都会查看调用堆栈中是否有东西并执行它直到调用堆栈为空: 入队函数执行 上面的示例看起来很正常,没有什么特别的:JavaScript 查找要执行的东西,并按顺序运行它们

    2.7K20
    领券