总体目标
我想知道 javascript 环境的以下部分如何作为一个系统互连。
- Javascript引擎
- 事件循环
- 事件队列
我们可以将其限制在浏览器环境中,因为节点已在另一篇文章(此处)中介绍过
我(相信)理解的事情:
Javascript 是单线程的,因此只有一个调用栈。
Javascript 环境仅提供少数真正异步的函数。这些可能包括 setTimeout()、setInterval() 和 I/O 函数。
- 如果不使用其中之一,开发人员无法创建自己的异步函数。
- Javascript 本身是同步运行的,但是一旦当前调用堆栈被清除,通过它的异步函数可以回调可能的阻塞函数。
例子:
console.log(‘Sync code started…’);
setTimeout(function asyncLog() {
console.log(‘Async function has completed’)
}, 2000);
console.log(‘Sync code finished…')
示例步骤:
(如果我错了,请更正步骤)
- 记录“同步代码开始...”
- setTimeout 被添加到堆栈但立即返回控制
- setTimeout 被发送到不同的“线程”……“工人”?在javascript的单线程之外计算2000毫秒
- 记录“同步代码完成...”
- 2000 毫秒后 asyncLog() 被推送到事件队列
- 因为调用堆栈是明确的,所以事件循环会检查事件队列中的待处理回调
- asyncLog() 从队列中移除并由事件循环推入堆栈
- 记录了“异步功能已完成”
- 调用堆栈现在很清楚
问题
如果有人可以概述异步函数(例如 setTimeout)从它们第一次到达调用堆栈到它们被回调到调用堆栈的时间和位置的步骤概述,那么这些不需要一一回答。
- 在第 3 步,谁产生了这个新线程?是浏览器吗?
- 这个新线程被阻止正确吗?
- 如果您有一个创建 1000 个 setTimeouts 的循环会发生什么。是否创建了 1000 个“线程”?
- 一次可以产生多少个线程有限制吗?
- 当新线程完成执行时,它是如何进入队列的?
- 谁提供事件队列?
- 谁提供事件循环?
- 事件循环是否轮询事件队列?
- javascript 的线程是否知道事件循环?还是事件循环只是将东西压入堆栈?
- 事件循环如何知道堆栈何时清空?