什么是 JavaScript 中的事件循环?
JavaScript 是一种单线程同步编程语言。但它实际上是什么意思?我们一直在谈论的 JavaScript 中的这个事件循环是什么?
当我们说 JavaScript 是单线程时,它实际上是什么意思?
这意味着运行 JavaScript 代码的主线程,一次一行地运行,没有并行运行代码的可能性。
例子:
Javascript
console.log("Before delay");
function delayBySeconds(sec) {
let start = now = Date.now()
while(now-start < (sec*1000)) {
now = Date.now();
}
}
delayBySeconds(5);
// Executes after delay of 5 seconds
console.log("After delay");
Javascript
function LevelTwo() {
console.log("Inside Level Two!")
}
function LevelOne() {
LevelTwo()
}
function main() {
LevelOne()
}
main()
输出:
Before delay
(... waits for 5 seconds)
After delay
JavaScript 中的内存分配:
1)堆内存:数据随机存储并分配内存。
2)栈内存:以栈的形式分配的内存。主要用于函数。
函数函数堆栈:函数堆栈是一个跟踪在运行时执行的所有其他函数的函数。当您在 JavaScript 中遇到错误时,曾经见过打印堆栈跟踪。这只不过是发生错误时函数堆栈的快照。
例子:
Javascript
function LevelTwo() {
console.log("Inside Level Two!")
}
function LevelOne() {
LevelTwo()
}
function main() {
LevelOne()
}
main()
函数执行的顺序,即在函数的目的结束后从堆栈中弹出,如下所示:
事件循环:事件循环是在函数堆栈变空时将内容从队列中拉出并放入函数执行堆栈的东西。
事件循环是 JavaScript 给我们一种多线程错觉的秘密,即使它是单线程的。下面的错觉很好地展示了事件循环的功能:
在这里,事件队列中的回调函数尚未运行,正在等待其进入堆栈的时间,此时 SetTimeOut() 正在执行并且 Web API 正在进行上述等待。当函数栈为空时,函数被加载到栈中,如下所示:
这就是事件循环出现的地方,它从事件队列中获取第一个事件并将其放入堆栈,即在本例中为回调函数。从这里开始,此函数执行调用其中的其他函数(如果有)。
这个循环称为事件循环,这也是 JavaScript 管理其事件的方式。