我有以下代码:
function sayHiLater(){
var greeting = "Hi!";
setTimeout(function() {
console.log(greeting);
}, 3000);
console.log("Hello before hi");
}
sayHiLater();
我想更好地了解事件监听器如何在幕后工作, 所以在我上面的例子中,当正在执行setTimeOut时,究竟发生了什么? 我知道它会创建一个新的执行上下文,但我的问题是;该执行上下文是否只是被延迟了3秒,这意味着执行堆栈正在转向其他事物,并且随着3秒结束它返回到执行上下文,或者它只是传递给浏览器引擎某种类型的匿名函数参数的引用,告诉它何时触发,然后立即从执行堆栈中弹出setTimeOut执行上下文。或者我与真正发生的事情完全不同。谢谢你的时间。
答案 0 :(得分:0)
它只是简单地向浏览器引擎传递一些匿名函数参数的引用,告诉它何时触发,然后立即从执行堆栈中弹出
setTimeOut
执行上下文。
是的,这正是发生的事情。 setTimeout
执行上下文立即返回(并跳转到下一个语句,即console.log
)。
然后在当前转弯完成并且不再执行任何代码之后,引擎将返回事件循环并等待发生某些事情。 3秒后,时间准备好触发回调,当没有其他代码执行时,事件循环启动匿名功能。
因此setTimeout
并非真正调用其回调,它只会计划以供日后使用。当计时器用完时,它将由事件循环本身调用。
请注意,放在计时器上的匿名函数是closure(它关闭greeting
变量),因此{的变量环境("范围")即使在从堆栈中弹出sayHiLater
执行上下文之后,也将保留{1}}(不进行垃圾回收),直到将要执行回调。