前端面试之4-2 js运行机制

前端面试之4-2 js运行机制_第1张图片

最后的打印顺序,1,3,2 

因为单线程异步。不管setTimeout是0还是1000ms。

前端面试之4-2 js运行机制_第2张图片

异步任务要挂起,同步任务执行完毕,才执行异步任务。


前端面试之4-2 js运行机制_第3张图片

这个只打印A,因为while是个同步任务,一直执行,不会打印B。同步一直在执行。



前端面试之4-2 js运行机制_第4张图片

这个猜测输出A,因为while是同步事件,同步执行完了之后,才能执行异步(输出B),但是同步while是执行不完的。


前端面试之4-2 js运行机制_第5张图片

猜测正确 ,同步执行完之前,异步是不会执行的。


前端面试之4-2 js运行机制_第6张图片

猜测输出:隔一秒,输出0,1,2,3

结果输出 4个4。

重新推理:因为for是同步的,所以外层是正常循环的,一直循环结束之后,才能执行setTimeout函数,而这个时候i已经是4了。

老师讲解:执行代码的时候,会先执行同步,遇到异步的任务,先把异步任务挂起,然后同步执行完了之后,再执行挂起的异步任务。但是执行到异步任务就会把任务放到异步队列吗?并不是。浏览器有一个time模块,主要用来处理setTimeout,setInterval(这个单词没有听清是啥。)。它是定时器到了那个时间,才会把这个语句放到异步队列中。for循环在执行的过程中,遇到setTimeout了,设置的是1000ms,定时器记住这个语句,但是并没有去执行,i就加一了。下一步也一样,并没有执行,交给了timer模块了。四个循环执行完,1000ms还没有到,所以并没有放到异步队列中。时间到了,定时器会把setTimeout放到异步队列,等到事件循环去执行。上一题讲的是同步任务和异步任务的优先顺序,本题重点在于异步任务的放入时间和执行时间。两个概念哦。



前端面试之4-2 js运行机制_第7张图片

单线程:一个时间内js只干一件事情。

任务队列:就是同步任务和异步任务。注意异步任务放入和执行时间。


前端面试之4-2 js运行机制_第8张图片

浏览器的js引擎遇到setTimeout,识别到这是一个异步任务。不会把它放到运行栈里面。而是把它拿走,拿走之后也不是立马放到异步任务队列中,自己先留着。同步任务执行完了之后,timer模块会把设定的时间,比如说是0(实际上也不是0,之前浏览器最小10ms,现在4ms,小于这个的也是按4ms),时间到了timer会把异步事件放到异步任务队列当中去。发现运行栈空了,就会读异步队列,发现里面还有任务,就会放到运行栈去执行。setTimeout里面的函数体,就会变成运行栈里面的同步任务,再去执行。执行完了之后,运行栈空了,再去监听异步队列中是不是有。如果有继续执行, 如此循环。

三个点:1、执行站执行的是同步任务。2、什么时候去异步队列取任务。3、什么时候往异步队列放任务。

问:什么时候开启异步任务?

前端面试之4-2 js运行机制_第9张图片

点按钮卡住了,因为是单线程,在执行别的任务。浏览器卡掉了。

前端面试之4-2 js运行机制_第10张图片

以上话的解析:

1、一个时间只干一件事请

2、任务队列有同步任务,有异步任务。

3、

4、

5、见上面解析。

这块非常重要啊。对日常开发很大帮助,不局限面试。

你可能感兴趣的:(前端面试之4-2 js运行机制)