JS执行机制(1)

87 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

JS执行机制

JS单线程

JavaScript语言的是单线程,同一个时间只能做一件事。这是因为javaScript是一门面向对象的语言,作为浏览器的内置脚本语言,为网页开发者提供操控浏览器的能力。

JavaScript是为处理页面中用户交互,以及操作DOM而诞生的。比如我们对某个DOM元素进行添加和删除操作,不能同时进行。应该先进行添加,之后再删除操作。

单线程就表明出,执行的任务需要排队,上一个任务结束后,才会执行下一个任务,这样就会导致一个问题,可能会使JS执行时间过长,导致页面渲染不连贯。

如下例子

console.log(1);

setTimeout(function(){

    console.log(2)

},2000);

console.log(3)

这样根据单线程,会导致在2s之后才会打印3,速度变慢,但是浏览器实际打印的顺序是1,3,2接下来,我们可以来看一下为什么有这种现象。

同步和异步

异步做法就是在做这件事的同时,还可以同时做其他的事情,多任务,多线程。

同步就是正常的一个任务结束后采取执行下一个。

由此就可以说明出上面结果原因,打印3的过程和定时器的打印2是同时进行的,浏览器不再等待时间执行,为异步操作。

PS:本质区别在于,这条流水线上各个流程的执行顺序不同。

再看下面例子
console.log(1);

setTimeout(function(){

    console.log(2)

},0);

console.log(3)

以上代码执行的顺序还是1,3,2,那么定时器时间为0,为什么不立马执行定时器里打印2的内容呢?我们来看一下下面解释。

同步任务和异步任务

同步任务:都在主线程上执行,形成一个执行栈 异步任务:JS的异步是通过回调函数实现,常见的有:

1.普通事件:例如clickresize

2.资源加载:如loaderror

3.定时器:如setTimeoutsetInterval 异步任务相关回调函数添加到任务队列中

JS执行机制

1.先执行执行栈中的同步任务

2.异步任务(回调函数)放入任务队列中。

3.执行栈里的所有同步任务执行结束后,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。

相当于先把同步任务执行完后再执行异步。