00:00
大家好,我是上硅谷H5学科的熊健,在程序员的节日到来之际呢,和大家分享一道面试题啊,咱们今天的面试题呢是no just世界中心机制。在讲这个题目之前呢,咱们来看一道这样的一个问题啊,我呢有三个函数,第一个呢是好,它呢设置时间是零,然后呢,输出一下啊,就是代表着这个函数被了。好,第二个呢,是一个特的函数叫做数,它呢我这里面呢也输。是这个函数被调了。好,这个参数呢,我不需要啊,好,最后一个呢,就是process ne函数,我把它也打印出下,哎,这个函数呢,也是no中特有的一个函数,打process。好,那么请问当前这三者的执行顺序又是怎样的?
01:02
再想想啊,前面这种呢,它它的也是为零,说明它是立即调用的,后面这两个呢,是一个是立即执行函数,这个也是立即直线函数,那么它们之间的顺序到底是怎样的呢?我们的右键run一下运行。好,这时候你会发现呢,它执行顺序啊是这样的。执行,然后接着是在执行,接着是IM在执行。然后呢,你会发现啊,不管你如何去换这个位置和顺序,它的执行顺序呢,是横不变的一个值。很遍,由于是这个process执行,再使我这个再执行,就在当前场景下,发现执行顺序呢,和我这个函数的位置呢,是没有任何关系的。所以说接下来呢,我们再研究一下,到底什么东西在影响着他们的执行顺序。
02:01
那这个呢,我们就叫做not just,世界能机制。好,那这里面呢,我们接下来往下走啊,那么just的世界型机制啊,来看。它到底是怎样去实现的呢?这里呢说一下啊,是借助一个库的。借助一个叫做力UV这库实现呢。那我们也可以去看一下这个库啊,到底长啥样,它呢?在get up中有啊,我们打开网页搜一下get up。好找一下这个网站,然后呢,去搜一个库啊,在这个左上角去搜,叫做UV。好,搜下D这库,诶,发现就在这啊,它们是用C语言和C加加语言实现的,然后它。打开它呢,先找到这个库啊,找到这个库呢,我们去搜一个文件,搜一个文件,这个文件呢,就是它主要实现的一个文件,可以按T去快速解锁。输入这个call,好,这里面呢有个Windows,有个unix,咱们看这个unix这个核心文件,这个用C语言写的,那你按CTRLF去搜这个UV run啊UV run就是这里面最主要的一个核心函数,我们会发现呢,这个函数呢,其实就是啊,它这个世界容器机制所运行的整体函数。
03:18
而这个函数中呢,你会发现呢,它其实里面呢,又调了一些其他函数,就这样呢,我们细数了下来,有很多各种的函数啊,整些这个函数呢,就构成了我整个事件续机制。整个这些函数构成了世件东西机制,那我们呢,这C原型呢?啊,我们来简要的概括一下,那这些函数到底做了哪些事,那这些事情呢,就是我们所说的世界轮训机制了,我们来看。那那这个世界能行机制呢,我们简要的概括呢,会发为我们概括一下啊。下时间东西一致。
04:00
那分为六个阶段。我有个阶段来看啊,第一个阶段呢,我们叫做time。Time阶段,那这个阶段呢,又称为啊定时器阶段。他呢是他呢负责做一些功能呢,就是去计时啊和执行。啊,这个这个阶段呢,他就做一些这件事啊。好,这是第一个阶段,那么第二个阶段呢,我们称之为是pending combat。好,这个阶段呢,他做什么事呢,他呢,这个阶段呢,是我们不去主要研究的,他呢就是做一些某些啊。系统的一些操作。啊,例如说。
05:00
啊,例如说就是像什么,例如什么TCP的错误啊。错误类型等等的回调函数啊,做一些这样的这个呢,我们不主要研究。好,接下来呢,第三个呢,我们来看一下啊,第三个呢,叫做啊是idol prepare阶段。而这个阶段呢,他呢就是一些做些准备工作,为后面的东西做一些准备工作而已啊,所以说这个阶段我们也不主要研究,我们主要研究的来看一下,就是这个第四个阶段啊,叫做破阶段,也叫做阶段。螺旋阶段好,那这个阶段它做什么事呢?啊,这里面呢,我们就说一下啊,它呢,在这个螺旋阶段中呢,有个东西我们称之为螺旋队列。这是个结构,它呢最终呢,就是这个结构中去拿出我想要的东西。好来看一下啊,它这里面呢,一共分为这一项这种情况。
06:04
以下情况啊,如果螺旋队列中有东西啊,螺旋队列不为空。说白了,里面有相应的一些回调函数,那这时候呢,他会去依次的。同步取出,就是说一个一个取出啊取出。回调函数中对列中的第一个回调函数。然后执行。都会这样做啊,会依次取出的,这个回调队列结构呢,我们叫做先进先出,它永远只会看第一个回电函数取出执行,那就不见了,接下来呢,第二个就会顶上去,下次呢就会把第二个取出执行啊,就是以此类推,直到呢我们不说直到。队列。为指导东西,或者呢,有另外一种情况啊,达到系统最大限制。
07:07
啊。好,螺须队列为空。那就是执行完了所有的回调函数。达到系统最大的限制呢,就说白了,就是可能你系统负载太高了,它呢直接崩溃了,就是会达到系统最大限制,那这样的话呢,都会退出这个循环的啊,那如果比方说啊,正常情况下呢,能循队列回为空,那如果这个循队列为空的话呢,会怎么办呢。啊,此时呢,它又分为一下这样的情况啊,如果之前设置过。Set immediate函数,也就是咱们之前的这个函数。如果之前呢,设置过这个函数的话呢,它呢会直接进入到下个阶段。
08:03
下个阶段呢,我们会说它是个测试阶段啊,直接进入到下个拆阶段好,如果之前呢,没有设置过的话呢。没有设置过这个回调函数,这个函数的话呢,诶,它就不会去下阶段了,就会在当前阶段。等待。等待什么呢?哎,这里面就等待,直到呢,螺旋队列。添加进来了新的函数。添加了回调函数啊。就会执行,就会又来到我第一个前面这第一个情况去执行啊,就会去第一个情况执行。好,这是添加回价函数,那这时候又没空的话呢,又回去检查之前有没有添加过相应的东西啊,那除了这种情况呢,还有一这种情况就是如果定时器到点了。
09:05
他也会去下个阶段。啊,这也是这样的,也会去下个阶段啊,也说这两个情况呢,才可能会跳出这个破阶段,否则的话呢,它会一直在破阶段等待,直到发生下啊就是这个这个好,接下来我们研究下这第五个阶段。第五阶段,我们叫做查阶段啊阶段。在这个阶段它做什么事呢?它就是专门去执行我之前这个设置的回函。是所有的函执行阶阶阶。
10:01
啊,这个阶段呢,它叫做关闭阶段。啊,说白了呢,就是啊,我们会去把这个事件叫做close事件,Close事件的回调函数呢,就在此阶段被执行。就会执行close事件的回家函数等等啊,那么这以上呢,这六个阶段呢,就构成了我们完整的这个世界能型机制啊,它呢,首先会去检查你这个定时器是否到点,到点了的执行,如果没有到点的话呢,它会往下走啊,直到来到我的破阶段,它会将这些大部分的一些回调函数呢,从这个轮型队列中取出来,然后依次执行。啊一一旦执行到这个逻队列为空的情况下呢,它会检查啊,如果之前设置过这个me函数,它就会直接进入到第五个阶段,然后依次执行,然后到第五个阶段呢,执行完这个回答数之后呢,又会来到第六个阶段去执行,执行完第六个阶段时候,注意啊,他这时候呢。因为咱们这个螺旋机制呢,相当于是死循环,它又会跳转到第一个阶段,接着又开始从第一个阶段开始执行,又开始一直来来个无限的循环过程,啊,这是这个设置过CC列参数,如果没有设置过的话呢,它就会在第四阶段一直停留着,直到螺旋队列中添加了新的函数,哎,这时候呢,它又回到到这种情况下去接着执行。
11:23
啊,或者是说哎,发现了,哎,我定时器到点了,它也回来到T阶段,然后再来到close阶段,最终呢,又来到time阶段,去执行我定时器的回电函数。那么整体呢,就构成了我的那not的事件能续机制啊,所以说我们再来看一下前面这三个函数啊,一个是一个not,还有一个process啊,我们先看前面两个,我们发现当我们note世界机制一开始的时候,它会经历time阶段,此时去计时的时候,发现呢,他计时呢是零。所以说立即就会执行我这3MO这个函数,接着才会来到我这个第四阶段破阶段,好,那发现呢,我之前设置过这个三面参数,所以说又会跳转到第五个阶段去执行它相应的回调函数。
12:10
所以说呢,在当前情况下呢,我set out的执行顺序呢,是比我set iate是更快一些的,所以说他先执行后执行,而跟他们的顺序呢,是没有任何关系的。好,那么这些讲完之后呢,我发现是不是还有一个process啊,那么他呢,又是怎么一回事呢。这里面我单独列举一下呢,能。能在任意阶段优先执行。能在任意阶段先执行,说白了,我这六个阶段呢,我process这个函数呢,都能够执行,所以说呢,并且它是优先执行的,所以说在他来到第一个阶段,那就立马的去执行process函数,才去执行这个函数。啊,所以说呢,这里就构成了咱们的这个执行顺序啊,这以上呢,就是我们no JS的这个事件容续机制这六个阶段的解析。
我来说两句