并发模型与事件循环
JavaScript 有一个基于事件循环的并发模型,事件循环负责执行代码、收集和处理事情以及执行队列中的子任务。
栈
函数调用形成了一个由若干帧组成的栈。
function foo(b) {
let a = 10;
return a + b + 11;
}
function bar(x) {
let y = 3;
return foo(x * y);
}
console.log(bar(7)); // 返回42
当调用 bar 时,第一个帧被创建并压入栈中,帧中包含了 bar 的参数和局部变量。
当 bar 调用 foo 时,第二个帧被创建并压入栈中,放在第一个帧之上,帧中包含 foo 的参数和局部变量。
当 foo 执行完毕然后返回时,第二个帧就被弹出栈(剩下 bar 函数的调用帧)。当 bar 也执行完毕然后返回时,第一个帧也被弹出,栈就被清空了。
堆
对象被分配在队中,堆是一个用来表示一大块(通常是非结构化的)内存区域的计算机术语。
队列
一个 JavaScript 运行时包含了一个待处理消息的消息列表。每一个消息都关联着一个用以处理这个消息的回调。
在事件循环期间的某个时刻,运行时会从最先进入队列的消息开始处理队列中的消息。被处理的消息会被移出队列,并作为输入参数来调用与之关联的函数,正如前面提到的,调用一个函数总是会为其创造一个新的栈帧。
感谢分享:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/EventLoop
https://blog.csdn.net/anleng6817/article/details/101127308