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

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

大家好,欢迎来到IT知识分享网。

目录

1.前言

2 生活举例 

3 由浅:

3 javascript事件循环 

4 举例异步之宏任务: setTimeout

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

                  7.入深


1.前言

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

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

2 生活举例 

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

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

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

3 由浅:

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

1.单线程和多线程 

单线程:我只有一只手。

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

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

3.并发及高并发

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

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

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

4.并行及高并行?

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

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

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

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

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

3 javascript事件循环 

  • 同步任务
  • 异步任务

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

  • 同步和异步任务分别进入不同的执行”场所”,同步的进入主线程,异步的进入Event Table并注册函数。
  • 当指定的事情完成时,Event Table会将这个函数移入Event Queue。
  • 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。
  • 上述过程会不断重复,也就是常说的Event Loop(事件循环)。
  • 总结:刚开始正常是一行一行执行代码。遇到异步任务,就把他扔到异步处理程序里面。先执行同步任务,同步执行完毕后去事件队列(eventloop)里面去执行异步程序,主线程执行完异步任务后,再去任务队列看看还有没有,有的话,再执行,再回去看有没有…一直循环,直到所有代码执行完毕。

4 举例异步之宏任务: setTimeout

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

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

setTimeout(() => {
    fn()
},3000)

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

4.1宏任务有哪些?

setTimeout
setInterval
script
I/O
UI交互事件
postMessage
MessageChannel
setImmediate(Nodejs环境)
 

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

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

微任务包含:

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

6.好了,试试手吧。

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


 输出 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>

 

7.入深

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

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')
    })
})

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

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10531.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信