Javascript-事件监听器如何在后台工作

Javascript - how event listeners work under the hood

本文关键字:后台 工作 事件 监听器 Javascript-      更新时间:2023-09-26

我有以下代码:

function sayHiLater(){
    var greeting = "Hi!";
    setTimeout(function() {
        console.log(greeting);
    }, 3000); 
    console.log("Hello before hi");
}
sayHiLater();

我想更好地了解事件听众是如何在引擎盖下工作的,所以在我上面的例子中,当setTimeOut被执行时,实际发生了什么?我知道它创建了一个新的执行上下文,但我的问题是;执行上下文只是被延迟了3秒,这意味着执行堆栈正在同时转移到其他事情上,当这3秒结束时,它又回到了执行上下文,还是它只是向浏览器引擎传递了某种匿名函数参数的引用,告诉它何时启动,然后立即从执行堆栈中弹出setTimeOut执行上下文。或者我只是离真正发生的事情很远。谢谢你抽出时间。

它只是简单地向浏览器引擎传递某种匿名函数参数的引用,告诉它何时启动,然后立即从执行堆栈中弹出setTimeOut执行上下文吗。

是的,这正是正在发生的事情。setTimeout执行上下文立即返回(并跳到下一条语句,即console.log)。

然后,在当前回合完成并且不再执行任何代码之后,引擎返回到事件循环并等待发生某些事情。3秒钟后,就可以启动回调了,当没有其他代码正在执行时,事件循环就会启动匿名函数
因此,setTimeout并没有真正调用它的回调,它只是为以后调度。当计时器用完时,它将由事件循环本身调用。

请注意,放置在计时器上的匿名函数是一个闭包(它在greeting变量上闭合),因此即使在sayHiLater执行上下文从堆栈中弹出之后,sayHiLater的变量环境("scope")也将被保留(而不是垃圾收集),直到要执行回调为止。