JavaScript并发模型和事件循环
1、简介 JS有一个基于“事件循环”的并发模型。 这个模型和其他语言(如C和Java)的模型不太一样。 下图描述的是一个理论模型,现代JS引擎在此基础上实现和进行了很多优化: 2、模型详细介绍 1)相关概念 (1)栈Stack:如下例,在调用g之前,以及在g返回之后,栈都为空。 function f(b) { var a = 12; return a + b + 35; } function g(x) { var m = 4; return f(m * x); } g(21); (2)堆:这里不介绍。 (3)队列: 待处理消息的列表,每条消息都关联一个回调函数。 JavaScript是单线程的( 多进程/多线程往往有更大的内存开销、上下文切换开销和数据竞争问题等 ),这意味着需要有一个队列保存异步执行的代码。 I、入队操作。例如,某个按钮被按下时,它的事件处理器代码被添加到队列;接收到某个Ajax响应时,回调函数的代码被添加到队列; 对于定时器,当指定时间过去后将其回调函数的代码添加到队列。 II、出队操作。 队列中没有任何代码是立刻执行的,但一旦进程空闲(此时栈为空)则尽快执行 。进程每次从队列中取出一条消息并调用其回调函数( 异步操作的结果通过回调函数获得 )。这使得栈变为非空。当栈再次变为空时,表示该消息处理完毕。 (4