👩🚀 摘要:本文循序渐进串联起JS运行机制相关的主要概念。从JS是单线程开始讲起,到JS为了提高效率,使用异步,到JS如何实现异步,再到浏览器是如何配合JS执行异步。
一、JS是单线程。
所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个。不妨叫它主线程。
选择单线程的原因之一是JS要操作DOM,如果多线程可能造成执行混乱。比如,有要删除节点的函数,有要编辑节点的。万一多线程执行顺序乱了先删除后编辑,就会出错。
二、JS的异步
单线程使得JS引擎只能一个任务结束再执行下一个,如果某任务时间较长,就会发生阻塞。为了解决这个问题。JS也使用了异步编程。
先简单介绍下同步(synchronous)和异步(asynchronous)。
同步和异步通常是用来形容一个函数被调用时发生的行为。
同步函数被调用时,调用必须获得预期结果后,才能继续后续行为。
而异步函数被调用时,异步函数的调用会很快完成,异步任务通常会被放到其他线程中执行。调用者就可以继续后续的操作,而不必等待这个任务执行完成,才运行。比如,下面这个ajax函数(使用jquery),
$.ajax({
url:"data.txt";
async:true; //默认为true,异步
success:function(data){
console.log(data;)
};
});
console.log('you are the best');
读取文件中数据这个任务,会被放到其他线程中去执行。等有结果再在控制台输出data。在未获得结果前,后面函数也可以执行。所以会是先输出’you are the best’,在输出文件内容。
JS的异步实现机制呢,就是我们在主线程(强调:在JS引擎中负责解释和执行JavaScript代码的唯一线程)外,新开一个线程用来执行那些异步任务,我们暂且称为