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

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

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

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

JS中的进程、线程、任务队列、事件循环、宏任务、微任务、执行栈等概念理解

JS中的进程、线程、任务队列、事件循环、宏任务、微任务、执行栈等概念理解 javascript中有很多需要知道的概念,尤其是标题中列出来的这些,今天就来过一下这些概念。...一、进程和线程 浏览器的每一个tab页可以看做是浏览器内核进程,每个进程下面会有多个线程来互相配合完成任务 比如 GUI线程JS引擎线程、网络线程、定时器线程等 二、任务队列 任务队列可以当做是一个个的对调任务...,当主线程的任务完成后,就开始执行任务队列中的任务(如果当前任务队列中再添加了新的异步任务,则其回调函数会放在之后的任务队列中) 三、事件循环 异步任务执行后,其回调会放到任务队列中。...当主线程任务执行结束后,就去任务队列中捞接下来要做的任务,放到主线程执行,直到任务全部结束。如果无新的任务可做,浏览器处于等待状态,知道新的外部输入、事件触发,这样一个循环过程称为事件循环。...具体概念我也没有查到,但是可以这样去理解,微任务就是执行完当前主线程任务后就要马上执行的任务,宏任务则是要放到下一次的事件循环中的主线程中的任务。

1.1K00

python循环执行

虽然这个例子没什么意思,但是在一些场合死循环得到重要应用,比如嵌入式设备中,一些程序要在上电后开始执行,一直到断电。 break与continue break语句跳出循环。...break print ('执行命令: %s' % (command))print ('退出程序.')exit () 虽然while循环是死循环,但是在用户输入'q'后,输出'跳出循环.'...,然后执行break:程序会跳出这个循环。跳出循环后,输出'退出程序.',然后结束程序。 如果用户输入其他内容,程序会输出'执行命令:',后面重复用户输入的内容。...退出程序. continue语句并不会跳出循环,而是会结束本次循环,进入下一次循环。如果continue语句得到了执行,则循环语句块中continue语句之后的内容不会得到执行。...break print ('执行命令: %s' % (command))print ('退出程序.')exit () 这个例子与上个例子的区别是,如果用户的输入以'#'开始,则会跳出本次循环执行下次循环

1.7K30

java for 循环或者while 里面使用线程池去执行代码,当都执行完成再往下执行

目录 1 问题 2 实现 1 问题 有一个for 循环,或者一个while 循环,里面的操作是调用其他的接口,如果不清楚需要调用多少次,反正互不影响,那么想要在这个里面使用线程池,并且这个while 里面的线程池里面的任务都执行完成之后...在使用executor.execute()提交任务后,你可以在循环结束后使用executor.isTerminated()方法来等待线程池中的所有任务完成。...具体步骤如下: 在循环结束后,调用线程池的shutdown()方法来关闭线程池。 使用executor.awaitTermination()方法等待线程池中的所有任务完成。...该方法会阻塞主线程,直到线程池中的所有任务都执行完毕或者超过指定的等待时间。 在等待线程池任务完成后,可以使用executor.isTerminated()方法检查线程池是否已经终止。...,例如处理未完成的任务或执行其他操作。

34910

js事件循环

首先,我们来解释下事件循环是个什么东西: 就我们所知,浏览器的js是单线程的,也就是说,在同一时刻,最多也只有一个代码段在执行,可是浏览器又能很好的处理异步请求,那么到底是为什么呢?...从上图我们可以看出,js线程它是有一个执行栈的,所有的js代码都会在执行栈里运行。...而当主线程执行完栈中的所有代码后,它就会检查任务队列是否有任务要执行,如果有任务要执行的话,那么就将该任务放到执行栈中执行。如果当前任务队列为空的话,它就会一直循环等待任务到来。...原因:因为一开始js线程中跑的任务就是macrotask任务,而根据事件循环的流程,一次事件循环只会执行一个macrotask任务,因此,执行完主线程的代码后,它就去从microtask队列里取队首任务来执行...注意: 由于在执行microtask任务的时候,只有当microtask队列为空的时候,它才会进入下一个事件循环,因此,如果它源源不断地产生新的microtask任务,就会导致主线程一直在执行microtask

18.7K41

JS 循环链表

循环链表的概念循环链表是一种链表的变体,其中链表中的最后一个节点指向链表的头节点,形成一个循环或环状结构。与普通链表不同,循环链表没有明确的结束点。...循环链表具有以下几个特点:循环性:循环链表是通过将最后一个节点指向头节点来形成循环的闭合结构。这意味着链表中没有明确的结束点,可以从任何节点开始遍历整个链表,直到回到原始出发节点。...灵活性:由于循环链表是循环的,因此可以在任意位置插入或删除节点,而无需修改其他节点的指针。这使得循环链表在某些场景下更加灵活和高效,例如实现循环列表、轮播图等。...场景应用:循环链表常用于需要循环遍历的场景。例如,在游戏开发中,可以使用循环链表来实现循环列表,遍历玩家角色队列;在轮播图或循环播放的场景中,可以使用循环链表来管理展示内容的顺序。...实现一个循环列表在 JavaScript 中,循环链表是一种特殊的链表结构,其中最后一个节点指向头节点,形成一个循环。这种数据结构可以用于处理需要连续循环遍历的场景。

11510

JS 事件循环

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

15.4K10

js --- 执行机制

JS为什么是单线程的?  JS最初被设计用在浏览器中,那么想象一下,如果浏览器中的JS是多线程的。...process1 删除了该dom,而process2 编辑了该dom,同时下达2个矛盾的命令,浏览器究竟该如何执行呢? 2 JS为什么需要异步?...如果JS中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。 对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验 3 JS线程又是如何实现异步的呢?   ...是通过的事件循环(event loop),理解了event loop机制,就理解了JS执行机制。...,而是延迟了一段时间,满足一定条件后才去执行的,这类代码,我们叫异步代码。

6.2K20

JS执行机制

JS 是单线程 JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。...这样所导致的问题是: 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。 2....于是,JS 中出现了同步任务和异步任务。 同步 前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。...同步任务指的是: 在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务; 异步任务指的是: 不进入主线程、而进入”任务队列”的任务,当主线程中的任务运行完了,才会从”任务队列...JS执行机制(事件循环) ? ? 4.

6.8K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券