范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

一文搞懂面试难点JavaScript事件循环机制

  本篇文章已经默认你有了基础的 ES6 和 javascript语法 知识。
  本篇文章比较细致,如果已经对同步异步,单线程等概念比较熟悉的读者可以直接阅读执行栈后面的内容了解 event loop 原理
  在了解 JavaScript 事件循环机制之前,得先了解同步与异步的概念 同步与异步同步(Syncconst cal = () => {    for (let i = 0; i < 1e8; i++) {        // 做一些运算    }} cal();console.log("finish");
  同步的含义是如果一个事情没有做完,则不能执行下一个。
  在这里的例子如果 cal 函数没有执行完毕 console.log 函数是不会执行的
  对于 cal 称为 同步函数。 异步 (ASync)$.ajax("xxx.com", function(res) {    // ...}); console.log("finish");
  在上述代码中,$.ajax 的执行是异步的,不会阻塞 console.log 的运行
  即不必等到 $.ajax 请求返回数据后,才执行 console.log
  对于 $.ajax 称为异步函数。
  为什么要有异步函数? 单线程
  javascript 是一门单线程语言,只能同时做一件事情。
  如果没有异步函数,堵塞在程序的某个地方,会导致后面的函数得不到执行,浏览器作为用户交互界面,显然要能及时反映用户的交互,因此要有异步函数。
  为什么 javascript 不采用多线程呢?专门派发一个线程去处理用户交互他不好吗?
  这个你可能得去问 javascript 的作者了。 执行栈
  由于 javascript 是单线程语言,因此只有一个执行栈(调用栈) function baz() {    console.log("exec")} function bar() {    baz();} function foo() {    bar();} foo();
  我们可以用一个动画来演示执行栈的调用过程
  根据动画流程,我们详细说一下调用栈的情况 main 函数,也就是把整个 javascript 看成一个函数,入栈foo 函数被执行,入栈bar 函数被执行,入栈baz 函数被执行,入栈console.log 函数被执行,入栈console.log 函数执行完毕,出栈baz 函数执行完毕,出栈bar 函数执行完毕,出栈foo 函数执行完毕,出栈main 函数执行完毕,出栈
  这种调用栈可以在程序报错的时候起到很好的 debug 的作用 function baz() {    throw new Error("noop!");} function bar() {    baz();} function foo() {    bar();} foo();
  在查看错误中,我们明显的看到了之前提到的调用栈。
  刚才的程序并无异步函数,
  如果我们在程序中用到了异步函数 console.log("begin"); setTimeout(function cb(){  console.log("finish")}, 1000);
  这个时候我们再看执行栈
  进栈出栈过程类似上面的分析,可是在这里,直到 main 函数执行完了,我们都没看到 cb 函数执行,可是确确实实 1000ms 左右后 cb 函数真的执行了,这里面是发生了什么情况?
  在解释这个之前,我们先引入两个概念 宏观任务和微观任务
  1. 宏观任务
  在 ES5 之前,异步操作由宿主发起,JavaScript 引擎并不能发起异步操作,这类的异步任务称为宏观任务,比较典型的有 setTimeout(() => {    console.log("exec")}, 2000);
  2.微观任务
  在 ES5 之后出现了 Promise ,用于解决回调地狱的问题,这个函数也是异步的,会等到 fulfill(resolve 或 reject) 后才会执行 then 方法 new Promise((resolve, reject) => {    resolve("hello world")}).then(data => {    console.log(data)})
  这个异步任务,由 v8 引擎发起 称为微观任务
  这两类任务对 event loop 也有影响
  接下来进入本文章重点!! event loop
  event loop 分为浏览器环境和 node 环境,实现是不一样的,本篇文章暂时只讨论浏览器环境下的 event loop
  1. 浏览器环境下的 event loop
  接下来,我们具体看一个很大的例子 console.log("1"); setTimeout(function cb1(){    console.log("2")}, 0); new Promise(function(resolve, reject) {    console.log("3")    resolve();}).then(function cb2(){    console.log("4");}) console.log("5")
  这段代码用 event loop 的解释是这样的
  用文字解释如下,上述动画以及文字解释忽略 main 函数 console.log("1") 入栈出栈,控制台显示 1setTimeout 入栈,加入异步任务队列(此时处于等待执行完成的状态,对于setTimeout来说就是等待延迟时间算执行完成,对于Promise 来说就是被 fulfill 了才算执行完成。new Promise 入栈出栈,控制台显示 3,并且把函数放入异步队列,等待完成了,就执行 then 方法,这里的话,演示动画忘记加上了。console.log(5) 入栈出栈,控制台显示 5
  至此,主函数内的任务全部执行完毕,
  这里需要先知道,当任务放入异步任务队列后他们如果完成了,就会自动进入微观任务或者宏观任务队列。
  这个时候 event loop 检索微观任务队列是否有任务,如果有,就拖到 执行栈中执行,如果没有的话,就检索宏观任务队列是否有任务。
  而且,如果一旦微观任务队列有任务,就一定会先执行微观任务队列的。
  如果一旦执行栈有任务就一定会先执行执行栈的。
  可以用代码表述如下 while (true) {    while (如果执行栈有任务) {        // 执行    }    if (微观任务队列有任务) {        // 执行        continue;    }    if (宏观任务队列有任务) {        // 执行        continue;    }}
  至此,我们很容易得到上面的代码的执行结果是 "1", "3", "5", "4", "2"
  在做一个宏观任务嵌套微观任务的例子加深上述流程的理解。 console.log("1"); setTimeout(() => {    console.log("2")    new Promise(resolve => {      resolve()    }).then(() => {      console.log("3")    })}, 0); setTimeout(() => {  console.log("4")}, 0); console.log("5")
  执行结果会是 "1", "5", "2", "3", "4"

艺术品游戏元宇宙哪个才是NFT的真正标签?当NFT遇上艺术品,一张图片一首歌一段视频,甚至一个头像都可以与一串代码擦出火花,身价发生几何倍数暴涨,突破现实世界认知。NFT全称为NonFungibleTokens,即非同质化数字孪生激发金融元宇宙新纽科技业务前景显现近日,随着Facebook的正式更名,一时间引发人们对于数字化未来的热议。同时,数字孪生概念也再次被推到聚光灯下。此前,全球知名研究机构Gartner就曾先后连续三年内均将数字孪生元宇宙与后数字时代的音乐产业发展音乐产业发展经过三个阶段第一阶段实体唱片为主流,主流音乐载体是磁带,CD光盘,实体传统音乐载体,第二数字存储传播手段为主的产业发展新阶段,科技推动数字化金蟾,2003年,互联网传播戴上助听器会让我的听力恢复正常吗?如果已经定性有了听力损失,不是说戴上助听器就能恢复到原来听力的,因为助听器只是一种听力辅助工具,是没有治疗效果的,所以不能期望戴了助听器以后听力会变好。不过正确佩戴经过科学验配的助耳机伤害听力?入耳式(耳帽)半入耳式(平头)哪个伤害更大?长期使用耳机肯定会导致听力出现损害,第一个佩戴的时间长,或者音量高强度噪音对内耳的损伤很厉害,我们日常如果戴耳机,第一个要注意控制时间,第二个自己要注意控制音量,第三要选择有质量保从小就听力差,60岁了戴助听器有效吗?你好,如果从小听力就差,说明听力损失的时间已经比较久了,那么患者的听觉功能肯定退化比较多,言语分辨能力也会比较差,但只要还有残余听力,验配助听器还是会有效果的,这个需要到专业的助听一边耳朵正常一边听力损失需要戴助听器吗?当然是需要佩戴助听器,这样可以使听力会平衡的,这样要看听力损失的情况,您要到专业的助听器验配中心,那里有专业的验配师会根据听力情况选配一款适合的助听器。单侧听损仅验配有听损的这侧耳全世界顶尖科技公司由印度人掌管,中国人不如印度人?印度小伙帕拉格阿格拉瓦尔在昨天成功出任美国一家知名科技企业的ceo。他的成就震撼了整个硅谷。并且更惊人的是,在帕拉格上任之后,如今微软谷歌这一批全世界最顶尖的科技企业全都是由印度人OPPOK11携6000mAh大电池来袭,骁龙870坐镇,新增12512GB版OPPO作为国产四大行业巨头之一,不仅拥有着雄厚的研发实力,还是线下最畅销的品牌。今年OPPO在新机更新节奏上虽没有老对手vivo激进,但OPPO的销量还是依旧能好几个季度稳居国产行业公认的三款顶级旗舰,价格很贵却没有短板,你会选哪个?电子产品都有一个特点就是更新速度特快,这一特点在手机行业中尤为突出。就拿5G打个比方,四年前还不知道5G是何物,甚至连概念都不齐全,而到了现在,5G网已经伴随着手机通信网络走向了家小米发烧失败,苹果再度登顶销量第一,中国厂商还有未来吗?随着最新款苹果手机iPhone13在中国的热卖,销量的节节上升的苹果再度坐到中国手机品牌销量第一的宝座上。根据市场调研机构的研究,在中国苹果再次拥有主导价格的实力,在中国手机市场价
2家世界500强来自县城,出了山东江苏首富,1家曾排名全国首位文丛树来源鲁商儒风世界500强已经不再那么稀罕了,短短30年,中国的世界500强企业数量从1家增长到了135家,连续第二年位居全球首位。在中国100多家世界500强企业中,有2家显很牛的3个县,都出了世界500强和千亿富豪,山东江苏2个县也不差文丛树来源鲁商儒风世界500强,千亿富豪,似乎很难和县城联系起来。在中国,有这么几个县,就出了世界500强,还出了财富超过1000亿元的超级富豪,有的还出了中国首富。1广东顺德2家儿子接掌扬子江药业,父亲去世后独立接班的4位山东富豪,咋样了文丛树来源鲁商儒风扬子江创始人徐镜人去世半个月,其子徐浩宇不出意料地接任董事长总经理等职,正式接班。出生于1972年的徐浩宇,将面临独立掌舵千亿商业帝国的挑战。创始人是一家企业的灵河南富豪,为家乡抗洪捐了多少钱?养猪首富捐1亿,教培富豪2千万文丛树来源鲁商儒风所谓一方有难,八方支援,通俗地理解,就是有力出力,有钱出钱。对于富豪们来说,最好的支援方式,当然是出钱了。所以,近年来,每逢灾难出现,都能看到富豪们慷慨解囊。这次教育培训企业跌惨了,1天跌一半,半年跌八九成,3位富豪财富缩水文丛树来源鲁商儒风对于教育培训行业来说,这个三伏酷暑比三九天还冰冷。上周五,3家中概股新东方高途和好未来,跌幅都超过50,一天之内,股价齐刷腰斩,跌得如此惨,实在鲜见。加上前段时间潍柴进世界500强,下一个山东企业是谁?山东高速海信还是浪潮文丛树来源鲁商儒风潍柴第一次进入世界500强名单,意外也不意外。说不意外,是因为潍柴早在多年前就已经跨过了世界500强的上榜门槛,今年门槛又降低了近百亿元说意外,是此前已经达到标准济南圣泉集团制造了多少富豪?28人财富超过1千万元,唐一林60亿文丛树来源鲁商儒风据说前两年一家以昆虫命名的企业过会时,杭州某栋办公楼的某层楼发出一阵响亮的欢呼声。有人说,那是对自由即将到来的欢呼财务自由。后来,企业出来澄清说,大家猜错了,是因烟台青岛等4家企业年赚100亿,淄博英科将过百亿,2位山东首富呢文丛树来源鲁商儒风100亿元,意味着每天净赚近3000万!对于一家企业来说,这不是一个小数目。根据2020年中国民营企业500强榜,上榜门槛刚超过200亿元中国企业500强的门槛为小米雷军高瓴张磊,都曾遇到了一个贵人,他们的回报也很感人文丛树来源鲁商儒风最近,两个一向很低调内敛的人,上了热搜。一位是雷军,演讲本来刷了一波屏,第二天又因为被训斥了1小时,又刷了一波屏另一位是高瓴资本的张磊,他完全是被动的。两人都堪称有逆向思维的人多厉害,山东江苏2位首富,都曾在别人甩卖时狂习文丛树来源鲁商儒风1990年代中期,中国纺织行业大萧条,国家下达限产压锭的政策,全国迎来了史无前例的大砸锭,国棉企业纷纷倒闭。张士平研究了政策后,开始大量收购纱锭,甚至直接收购破产给手机充电也能体验水墨丹青,飞利浦这款移动电源给我火随着科技和时代的发展,移动电源如今已成为人们日常生产生活中不可或缺的必需品。虽然现下生产移动电源的品牌不在少数,但目前市面上的移动电源大多停留在工具层面,无论在功能还是外观方面基本