【JavaScript】事件执行机制、同步与异步、事件循环(event loop)

JavaScript的一大特点是单线程,但是如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。而在JS中单线程又是很有必要的,因为事件执行或者渲染需要有先后顺序,因此JS提出了同步和异步的概念。

  • 同步: 可以理解为单线程,前一个任务执行完了才会去执行下一个任务,按照代码顺序执行。
  • 异步: 可以理解为多线程,前一个任务需要花费很长时间,在这个时间里,可以同时去做其他事情。

js中任务的执行机制是:

1. 同步任务桉顺序放在主线程上,异步任务先放在异步进程处理模块中。先按顺序执行主线程上的任务,全都执行完之后,再来处理异步任务。
js中的回调函数都属于异步任务,常见的异步任务包括:

  • 定时器,setInterval,setTimeout等;
  • DOM事件,如click,resize,keyup等;
  • ajax(网络模块)。

2. 当异步处理模块中的任务条件触发时(比如click事件鼠标点击了,定时器时间到了等)。这时候就会把对应任务(回调函数) 推送到任务队列(消息队列) 中(按事件触发的顺序推入任务队列)。
当主线程上的任务都执行完后,主线程就会去任务队列中查询是否有新任务,如果查询到任务,就会把它推入主线程去执行,所以回调函数一般在所有同步任务完成之后才被执行。例如:

console.log(1);
setTimeout(function() {
    
    
    console.log(3);
}, 0);
console.log(2);

输出结果顺序是:1 2 3 。这里console.log都是同步任务,即使定时器为0ms,也是在所有同步任务执行完毕之后才执行。

3. 主线程闲置后会不断地去任务队列中查询是否有新任务,一旦有新任务就会把它推入主线程去执行。这个不断查询并推送任务的过程就称为事件循环(event loop)

整个执行机制可以用下面这张图来解释:
在这里插入图片描述
2022.03.26补充:
这里的异步进程处理模块其实是宿主环境,宿主环境就是js文件的执行环境,比如浏览器或者node。主线程先把异步任务委托给宿主环境,然后异步任务执行完成或者叫满足条件后,将回调函数推到任务队列中,进行event loop。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43790653/article/details/123561952