Javascript - 事件监听器如何工作

时间:2015-11-05 12:25:56

标签: javascript function events listener

我有以下代码:

function sayHiLater(){
    var greeting = "Hi!";
    setTimeout(function() {
        console.log(greeting);

    }, 3000); 
    console.log("Hello before hi");
}

sayHiLater();

我想更好地了解事件监听器如何在幕后工作, 所以在我上面的例子中,当正在执行setTimeOut时,究竟发生了什么? 我知道它会创建一个新的执行上下文,但我的问题是;该执行上下文是否只是被延迟了3秒,这意味着执行堆栈正在转向其他事物,并且随着3秒结束它返回到执行上下文,或者它只是传递给浏览器引擎某种类型的匿名函数参数的引用,告诉它何时触发,然后立即从执行堆栈中弹出setTimeOut执行上下文。或者我与真正发生的事情完全不同。谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

  

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

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

然后在当前转弯完成并且不再执行任何代码之后,引擎将返回事件循环并等待发生某些事情。 3秒后,时间准备好触发回调,当没有其他代码执行时,事件循环启动匿名功能。
因此setTimeout并非真正调用其回调,它只会计划以供日后使用。当计时器用完时,它将由事件循环本身调用。

请注意,放在计时器上的匿名函数是closure(它关闭greeting变量),因此{的变量环境("范围")即使在从堆栈中弹出sayHiLater执行上下文之后,也将保留{1}}(不进行垃圾回收),直到将要执行回调。