关于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.