昨天忘了写推文了,今天就写写关于JavaScript这门单线程语言的一些代码执行机制~
简述
JavaScript是一门单线程的语言,可以简单理解为js引擎在编译解释代码的时候是自上而下的,一旦遇到难啃的代码的时候就会卡壳,甚至是报错!
不过,JavaScript并不是如此"头铁之人"。于是,就有了异步这有用的工具(直接带飞好吧)~。废话不多说,直接进入正题。
一个不太复杂的过程
JavaScript的执行机制如上图所示(借由别人的图),简单说明一下:
JavaScript自上往下的执行代码
执行过程中遇到异步操作->浏览器提供进程处理异步代码(JavaScript继续执行同步操作)->异步操作处理完毕->将相应的回调函数按照异步结束的顺序加入到任务队列(其实没那么简单,为了方便解释简单这样理解)
JavaScript执行完同步操作->顺序执行任务队列中的回调函数(如果没有任何异步操作,则此时JavaScript引擎处于闲置状态)
事件循环与任务队列
事件循环:很容易理解,按照"先进先出"的原则,先进入任务队列的回调函则先弹出任务队列并执行之,不断循环弹出回调函数直到任务队列清空便是事件循环。
任务队列:便是存放回调函数(回调函数指的是即先不执行,将来执行的函数,特指异步操作结束后调用的函数)的地方。当然,任务队列是有优先级的,就如用户IO(交互事件)的回调函数就有VIP特权,就算其异步回调较晚,他也得先排在其他优先级低的回调函数前面。
并发
并发:指的是异步操作完毕后的回调函数交替执行,如:可能先吃饭->后洗澡
或先洗澡->后吃饭。
异步操作涉及到并发的现象,就如靠着的两次ajax请求(用伪代码表示):
ajax(".......","............");
ajax(".......","............");
如果两次ajax请求的内容十分简单,异步操作结束的很快,那么就很难判断谁的回调函数先加入任务队列~
这里特别要注意并发出现的问题:如果两次回调的函数相关联,则回调的顺序有可能会相互影响最终的结果,(为了提高代码的重用性)这时候则需要人为的添加限制条件,这里就不再展开了~
求关注
领取专属 10元无门槛券
私享最新 技术干货