既然js是单线程语言,所以我们可以得出结论:javascript是按照语句出现的顺序执行的。
那么问题来了:我们在浏览一些门户网站时,页面上的内容是非常丰富的,包括图片、视频、广告等等,这些资源的加载是非常耗时的,难道我们要卡着直到某一张高清图片完全显示出来?然后接着再卡着去加载下一个耗时资源吗?,这对用户体验来说是非常糟糕的。
这显然是不合理的,就目前我们所看到的网站的资源加载并不是这样的,直观上的感受可以看到页面上的内容是逐渐显示的,先显示一部分,然后再显示另一部分,甚至有时候我们会发现有些文本内容是先显示出来的,而图片是后加载的。
那就与我们前面所说的结论相悖了,那么肯定是有什么机制来实现这种效果的。
js实际上将任务分成两种,一种是同步任务,一种是异步任务。
这个过程就是事件循环机制,主线程不断的执行任务,
不断的运行这个过程,不断的check
任务队列中是否有任务,如果有就拿出来执行,直到任务队列为空后,就会等待新的任务加入。
线程:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。用于实现并发执行和任务的并行处理。
多线程:多线程是通过多核CPU的硬性条件,开启多个线程来实现并发处理多个逻辑, 从而提高程序的执行效率, 但如果只有一个核心的CPU, 多线程实际上是通过CPU的时间片轮转(快速切换上下文)来实现的, 也就是说在同一时间内也只有一个线程在执行, 其他线程处于等待状态。
异步:异步是一种编程模型,用于处理任务的执行方式。 异步编程通常涉及到回调函数、事件循环、Future/Promise等机制,通过非阻塞的方式实现任务的并发处理。