Javascript-事件监听器如何在后台工作
Javascript - how event listeners work under the hood
我有以下代码:
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")也将被保留(而不是垃圾收集),直到要执行回调为止。
相关文章:
- Chrome扩展程序在后台工作
- ngRoute 在 angularjs 中作为依赖项包含在后台时如何工作
- 无法通过“&”使nodejs在后台工作
- jQuery Mobile App 的后台工作线程
- Chrome 扩展程序:无法让消息传递在后台脚本和内容脚本之间正常工作
- addEventListener 如何在后台工作
- heroku上的后台工作网络是如何知道的's结束了
- 没有web工作程序的Javascript后台处理
- querySelector是如何在后台工作的
- Javascript-事件监听器如何在后台工作
- jQuery点击事件不工作时,全屏iframe在后台
- 改变后台javascript功能不工作
- 在node.js中使用工作/后台进程vs .异步调用
- Ajax表单重载页面,而不是在后台工作
- 为什么css后台jQuery代码不工作jQuery设置多个css值
- 如何使一个phonegap构建应用程序在后台工作
- 使用canvas创建桌面通知图像,只有一个图像可以从后台页面工作
- force.start (d3.js) 是否在后台工作
- selenium (Firefox后台),sendkeys工作,但不聚焦
- 在HTML5应用程序中下载后台数据到浏览器数据库- settimeout vs工作线程