事件循环与任务队列

昨天忘了写推文了,今天就写写关于JavaScript这门单线程语言的一些代码执行机制~

简述

JavaScript是一门单线程的语言,可以简单理解为js引擎在编译解释代码的时候是自上而下的,一旦遇到难啃的代码的时候就会卡壳,甚至是报错!

不过,JavaScript并不是如此"头铁之人"。于是,就有了异步这有用的工具(直接带飞好吧)~。废话不多说,直接进入正题。

一个不太复杂的过程

JavaScript的执行机制如上图所示(借由别人的图),简单说明一下:

JavaScript自上往下的执行代码

执行过程中遇到异步操作->浏览器提供进程处理异步代码(JavaScript继续执行同步操作)->异步操作处理完毕->将相应的回调函数按照异步结束的顺序加入到任务队列(其实没那么简单,为了方便解释简单这样理解)

JavaScript执行完同步操作->顺序执行任务队列中的回调函数(如果没有任何异步操作,则此时JavaScript引擎处于闲置状态)

事件循环与任务队列

事件循环:很容易理解,按照"先进先出"的原则,先进入任务队列的回调函则先弹出任务队列并执行之,不断循环弹出回调函数直到任务队列清空便是事件循环。

任务队列:便是存放回调函数(回调函数指的是即先不执行,将来执行的函数,特指异步操作结束后调用的函数)的地方。当然,任务队列是有优先级的,就如用户IO(交互事件)的回调函数就有VIP特权,就算其异步回调较晚,他也得先排在其他优先级低的回调函数前面。

并发

并发:指的是异步操作完毕后的回调函数交替执行,如:可能先吃饭->后洗澡

或先洗澡->后吃饭。

异步操作涉及到并发的现象,就如靠着的两次ajax请求(用伪代码表示):

ajax(".......","............");

ajax(".......","............");

如果两次ajax请求的内容十分简单,异步操作结束的很快,那么就很难判断谁的回调函数先加入任务队列~

这里特别要注意并发出现的问题:如果两次回调的函数相关联,则回调的顺序有可能会相互影响最终的结果,(为了提高代码的重用性)这时候则需要人为的添加限制条件,这里就不再展开了~

求关注

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180713G20TT300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券