事件循环
首先我们需要先了解进程和线程的概念:
- 当我们启动一个程序时,系统会为该程序创建一个进程,并在内存中开辟一块空间用于处理该程序。
- 线程是操作系统能够运行运算调度的最小单位,通常情况下它被包含在进程中。
- 进程中通常会创建许多线程共同处理程序的运行。
在浏览器中,每一个标签页就是一个进程,这样可以保证,一个页面的崩溃不会影响到其他页面的正常运作。
其中处理JS的只有一个线程,成为渲染主线程,由于只有一个线程处理JS代码,所以当其中存在耗时操作时,会一直等待此操作完成才能继续向下执行,造成了阻塞,所以出现了事件循环用来解决这种情况。
当我们进行耗时操作(如计时器,异步请求等,我们称之为任务)会交予其他线程进行处理,不会影响渲染主线程的继续执行,如果在JS代码执行过程中,存在任务完成了,会将其放在任务队列中,任务队列分为微队列和宏队列,(有些浏览器可能会对宏队列进行进一步的队列细分,它们同样存在不同的优先级)。
事件循环的依次迭代为:宏任务 -> 微任务 -> 渲染 -> 循环。
最开始的JS执行是执行script中的代码,可以将其看为宏任务,其中可能会产生其他宏任务或微任务,当当前宏任务执行完毕,会将微任务队列中的任务清空,如有必要,会进行UI渲染操作,然后进入下一次循环,以此往复。