js执行机制(同步,异步)

简介: js执行机制(同步,异步)

1.前言


javascript 是一门(动态、弱类型、面向对象)单线程,解释性(脚本)语言。执行过程是自上而下,一行一行的。ps:要明确一个观念,所谓的js、primise、$nextTick、axios、同步异步、微任务宏任务……一切的一切只不过都只是个工具而已,他的出现只为解决问题,他们的存在也是为解决问题才存在。


本篇文章尽量不涉及专业名词,尽可能用通俗易懂的词语,解释JavaScript的运行机制,及阐述同步任务和异步任务。注:异步任务又细分为微任务和宏任务。  

2 生活举例


现在我就是JavaScript。我妈让我回家吃饭,吃完饭去洗漱,然后睡觉。我按部就班的吃饭、洗漱、睡觉,很简单么,按流程顺序走就完事了。


第二天,我去银行上班,我是窗口的业务员,别人来办业务,就会排队,我按照排队的人的顺序,每次给一个人办业务,有时候,有那么个人磨磨唧唧,这事那事的耽误我不少时间,后面排队的人很着急,可是没办法啊,倒霉白。可惜了,整个银行就我这一个窗口。看看隔壁的银行,窗口老多了,不用等半天,而且遇到磨磨唧唧的人也会好很多。


第三天,我想到一个好办法! 有一个办业务磨磨唧唧的人,我对她说,你先去天津教育大厦买一瓶水,然后再到我这里来。于是,我把他打发走了,虽然我最终还是要处理这个磨磨唧唧的人,可是剩下的人就可以立刻帮他们办业务了,或许等那个墨迹的人回来,我这里就很空闲,这样就不会耽搁时间了,妙啊。

3 由浅:


在深入之前,先了解一下概念:


1.单线程和多线程


单线程:我只有一只手。


多线程:我是哪吒,能同时拿手机,敲代码,吃冰柜。


2.进程和线程的概念和区别:百度。


3.并发及高并发?


你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。最惨的是来了电话我不接,吃完饭才接。


无论上一个开始执行的任务是否完成,当前任务都可以开始执行并发的关键是你有处理多个任务的能力,不一定要同时


其实,与之相反的是,你只能等待上一个任务结束,才能执行下一个任务。


4.并行及高并行?


你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。


4.1 并行的关键是你有同时处理多个任务的能力。


4.2 最关键的点就是:是否是『同时』。


总结:js是通过队列机制,事件机制实现并发的。而所谓的同步异步也是基于js的运行机制,才产生的。


5.宏任务和微任务:他俩执行的时候不是放在一个执行队列里,先执行微任务队列,在执行宏任务。所以:同步任务 > 异步任务(微任务)>异步任务(宏任务)

4 javascript事件循环


  • 同步任务
  • 异步任务


20210615004053125.jpg

同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。

当指定的事情完成时,Event Table会将这个函数移入Event Queue。

主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。

上述过程会不断重复,也就是常说的Event Loop(事件循环)。

总结:刚开始正常是一行一行执行代码。遇到异步任务,就把他扔到异步处理程序里面。先执行同步任务,同步执行完毕后去事件队列(eventloop)里面去执行异步程序,主线程执行完异步任务后,再去任务队列看看还有没有,有的话,再执行,再回去看有没有…一直循环,直到所有代码执行完毕。

5 举例异步之宏任务: setTimeout


他是一个经典宏任务,举例一下他的使用,来验证js的运行机制。请问这个定时器里面的函数会在3秒之后调用吗?


答案:不可能。首先定时器会被扔到任务队列中,接着执行同步任务for循环,结果掉进坑了,出不来了,3秒后,定时器说:‘哎!我到点了,该执行我里面的fn()函数了’,结果js说:‘等……等一下…呃!’ 这个定时器等了远远超过3秒,具体啥时候就不一定了。第二个,定时器如果不写延时时间的话,最早可得的空闲时间执行,而浏览器默认大概4毫秒。

setTimeout(() => {
    fn()
},3000)
for(let  i = 0 ; i < 一万万亿次; i++)   //随便举例,切勿当真,不然崩溃别找我。

5.1宏任务有哪些?

setTimeout

setInterval

script

I/O

UI交互事件

postMessage

MessageChannel

setImmediate(Nodejs环境)

6 异步之微任务:Promise与process.nextTick(callback)


我理解的promise是一个为了解决回调地狱而设计出的一个对象,里面有一些方法。他本身是同步的(就一对象而已),只不过里面的then是异步的,但then的目的是同步(或者更像同步,毕竟同步最容易理解),以及基于promise的async,await


微任务包含:

Promise.then
Object.observe
MutaionObserve
process.nextTick(Node.js环境)

7.好了,试试手吧


image.png

 输出 1 2 4 5 3 6
<script>
   const promise = new Promise((resolve,reject)=>{
     console.log(1);
     resolve(5)  可以看成是监听then(val)做完了的状态,其实可以把它看成是同步的
     console.log(2);
   }).then((val)=>{
     console.log(val);
   })
   console.log(4);
   promise.then(()=>{
     console.log(3);
   })
   setTimeout(()=>{
     console.log(6);
   },0)
  </script>

8.入深

下面这个包含所有任务,且局中局套中套。我会详细解释,为什么这么输出。

console.log('1');
setTimeout(function() {
    console.log('2');
    process.nextTick(function() {
        console.log('3');
    })
    new Promise(function(resolve) {
        console.log('4');
        resolve();
    }).then(function() {
        console.log('5')
    })
})
process.nextTick(function() {
    console.log('6');
})
new Promise(function(resolve) {
    console.log('7');
    resolve();
}).then(function() {
    console.log('8')
})
setTimeout(function() {
    console.log('9');
    process.nextTick(function() {
        console.log('10');
    })
    new Promise(function(resolve) {
        console.log('11');
        resolve();
    }).then(function() {
        console.log('12')
    })
})

20210615234026290.png

额,还有好多想法写不出来,火候不到,时间不到,等以后再来补上吧。

相关文章
|
2月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
15 1
|
2月前
|
前端开发 JavaScript 数据处理
在JavaScript中,什么是异步函数执行的例子
在JavaScript中,什么是异步函数执行的例子
10 0
|
2月前
|
前端开发 JavaScript
JavaScript的异步操作
JavaScript的异步操作
|
2月前
|
设计模式 JavaScript 前端开发
深入理解 JavaScript 中的绑定机制(下)
深入理解 JavaScript 中的绑定机制(下)
|
2月前
|
JavaScript 前端开发
深入理解 JavaScript 中的绑定机制(上)
深入理解 JavaScript 中的绑定机制(上)
|
2天前
|
JavaScript 前端开发 开发者
【JavaScript技术专栏】JavaScript事件处理机制详解
【4月更文挑战第30天】本文探讨JavaScript中的事件处理机制,涉及事件类型(如click、mouseover)、事件流(冒泡型、捕获型及目标阶段)、事件处理函数(内联与addEventListener方法)以及事件委托(用于优化内存和处理动态元素)。此外,还介绍了事件取消,通过`preventDefault()`和`stopPropagation()`控制事件行为。理解这些概念对构建交互式Web应用至关重要。
|
2天前
|
JavaScript 前端开发
Node.js中的错误处理机制
【4月更文挑战第30天】本文介绍了Node.js的错误处理机制,包括Error对象、try-catch、错误事件监听及Promise和async/await的错误处理。错误通常封装在Error对象中,可自定义错误类型。try-catch用于捕获异常,但不适用于异步错误。事件监听器处理对象发出的&#39;error&#39;事件,防止应用崩溃。Promise的.catch()和async/await结合try-catch用于处理异步错误。良好的错误处理是保证应用健壮性和可靠性的关键。
|
3天前
|
消息中间件 存储 前端开发
理解JavaScript事件循环机制
理解JavaScript事件循环机制
|
4天前
|
JavaScript 大数据 开发者
Node.js的异步I/O模型与事件循环:深度解析
【4月更文挑战第29天】本文深入解析Node.js的异步I/O模型和事件循环机制。Node.js采用单线程与异步I/O,遇到I/O操作时立即返回并继续执行,结果存入回调函数队列。事件循环不断检查并处理I/O事件,通过回调函数通知结果,实现非阻塞和高并发。这种事件驱动编程模型简化了编程,使开发者更专注业务逻辑,为高并发场景提供高效解决方案。
|
7天前
|
前端开发 JavaScript
在JavaScript中,回调函数、Promise和async/await这三种异步处理机制的优缺点
JavaScript的异步处理包括回调函数、Promise和async/await。回调函数简单易懂,但可能导致回调地狱和错误处理困难。Promise通过链式调用改善了这一情况,但仍有回调函数需求和学习成本。async/await提供同步风格代码,增强可读性和错误处理,但需ES8支持,不适用于并发执行。根据项目需求选择合适机制。