分享

带你简单理解JavaScript运行机制

 wenxuefeng360 2022-11-05 发布于四川

  一、同步与异步:

  1.同步:按照顺序一步一步执行下来。例如

1
2
3
console.log('1')
console.log('2')
console.log('3')           

   输出顺序就是123

 

 

 

  2.异步:先执行一部分,等到结果(或者时间到)在执行后续。即同步执行完毕之后(全部执行完毕),在执行异步。

  例如:1)计时器函数:setInterval与setTimeout   2)Ajax   3)读取文件。

  举例:

1
2
3
4
5
6
console.log('1')
setTimeout(()=>{
        console.log('2')
},0)
console.log('3')
console.log('4')   

  那么输出顺序就是1342

 

  二、单线程:

  1.定义:JS在一个时间段内只能执行一种工作。所以同步的函数是,按照顺序一条一条走下来。等同步完成之后在执行异步函数。

  如果计时器函数倒计时结束,但是同步函数还没执行完毕,那么是执行同步函数还是执行异步

  举例:现在将输出语句循环输出一万次,此时设定计时器时间10ms等到计时器时间结束了结果是什么?

1
2
3
4
5
6
7
8
9
for(var i=0;i<10000;i++){
         console.log('1')
     }
     setTimeout(()=>{
         console.log('2')
     },10)
     setTimeout(()=>{
         console.log('3')
     },100)

  

 

  根据结果可以看出,只有等同步函数全部执行完毕之后才会执行异步函数。

 

   2.原理:

    1)运行栈:只运行同步函数,一行一行按顺序执行。

    2)任务队列:当异步函数(时间到)之后进入队列在一条一条执行。

    3)事件循环:异步函数(计时器)没到时间之前,先在事件循环中循环,等到时间之后,在进入任务队列。

  三、宏任务与微任务:

  1.宏任务与微任务是将异步函数进行分化演变了两个步骤;先执行微任务,再执行宏任务。

  2.宏任务:计时器、ajax、读取文件

  3.微任务:promise.then方法。

  3.特殊函数:

    1)process.nextTick:同步之后,异步之前。

    2)setImmediate:在计时器为0之后1之前

    3)promise(()=>{  内为同步}).then(()=>{异步微任务})

  4.那么真正的顺序是:同步》process.nextTick》微任务(promise.then)》宏任务(setImmediate)

 

   四、实战练习:

  1.练习一:很简单没有任何难度:

 

  答案:25687314

 

   2.在检测一下:

复制代码
setTimeout(function() {
  console.log(1)
}, 0);
new Promise(function(resolve, reject) {
  console.log(2);
  resolve()
}).then(function() {
  console.log(3)
});
process.nextTick(function () {
  console.log(4)
})
console.log(5),
复制代码

  答案:52431

  五、总结:

  为什么要学习低层的运行逻辑,我只要会用不就好了吗?但是一旦遇到bug 或者遇到逻辑问题,不至于慌张,至少知道大概哪里出现了问题。而且只有你了解了如何运行的,你才能走得更远。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多