关于js事件循环

在聊并发模型和事件循环之前,我们首先了解一点概念。

javascript是单线程。但是浏览器是多线程的。

在处理xhr,DOM或者I/O等耗时操作时。如果只是单纯依靠单线程来完成,js便会处于阻塞状态,js会等待耗时代码完成后才会继续执行。

js引入事件循环(event-loop)机制来解决这个问题。

 

这里有几个知识点需要点出:

函数调用的时候会形成栈帧。帧中包含了该函数内部的局部变量和参数。假设函数中调用了其他的函数,会继续压入新的栈帧。当其他的函数执行完毕,将其从栈中弹出,执行下一个栈,直至空栈。

 

js的中的变量对象啊什么的都是存在堆中的。

 

js运行时会生成一个消息队列。队列遵循先进先出的原则。

 

之所以称为事件循环,是因为它经常被用于类似如下的方式来实现:

while (queue.waitForMessage()) {
  queue.processNextMessage();
}

 waitForMessage就是上面提到的消息队列。

 

 

JS引擎运行时需要用到堆和栈。当栈为空时,读取消息队列,若有消息,即调用与消息相关联的函数,并初始化栈结构,执行这个函数过程中涉及到的函数调用都通过压栈弹栈来实现。而栈中代码又可能调用外部API(DOM事件,ajax,定时器),于是消息队列中又添加了新的消息,等待栈空时被JS引擎读取执行。于是构成了 Event Loop.

 

posted @ 2018-01-30 14:58  边若愚  阅读(159)  评论(0编辑  收藏  举报