携手创作,共同成长!这是我参与「掘金日新计划 · 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.普通事件:例如click,resize
2.资源加载:如load,error
3.定时器:如setTimeout,setInterval
异步任务相关回调函数添加到任务队列中
JS执行机制
1.先执行执行栈中的同步任务。
2.异步任务(回调函数)放入任务队列中。
3.执行栈里的所有同步任务执行结束后,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。
相当于先把同步任务执行完后再执行异步。