Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS调用堆栈是否总是至少有一个帧?_Javascript_Callstack_Event Loop - Fatal编程技术网

Javascript JS调用堆栈是否总是至少有一个帧?

Javascript JS调用堆栈是否总是至少有一个帧?,javascript,callstack,event-loop,Javascript,Callstack,Event Loop,坦率地说,我最近看到了一个非常出色的JS调用堆栈,但我现在有一个关于JS调用堆栈的挥之不去的问题。如果将全局执行上下文看作main(),那么main()是否从未解析过?我在这里的理由是,如果是,那么JS程序将完成,并且不会发生回调 --编辑 这里我主要感兴趣的是如何表示调用堆栈与回调队列的关系。如果说事件循环在将新帧推送到堆栈之前等待调用堆栈为空,那么循环将等待程序完成,回调将不会产生任何效果 我想这意味着事件循环将等待,直到只剩下一个帧(主执行上下文),而不是没有帧。正如您所说,main()是

坦率地说,我最近看到了一个非常出色的JS调用堆栈,但我现在有一个关于JS调用堆栈的挥之不去的问题。如果将全局执行上下文看作main(),那么main()是否从未解析过?我在这里的理由是,如果是,那么JS程序将完成,并且不会发生回调

--编辑

这里我主要感兴趣的是如何表示调用堆栈与回调队列的关系。如果说事件循环在将新帧推送到堆栈之前等待调用堆栈为空,那么循环将等待程序完成,回调将不会产生任何效果

我想这意味着事件循环将等待,直到只剩下一个帧(主执行上下文),而不是没有帧。

正如您所说,main()是全局执行上下文。直到:

  • 如果您在浏览器中,请关闭该选项卡
  • 如果您在服务器(如节点)上,则会终止进程
  • 选项卡/进程崩溃
因此,除非发生上面的一个用例,否则运行时仍然是活动的,事件循环(将处理任务队列)也是活动的

如果您将全局执行上下文看作main()

否。
main
不是,它是最初在该上下文中运行的代码。在全局代码运行后,全局环境(通过闭包)仍然为未完成的回调保留,在程序完成之前,它不会被垃圾收集

main()是否从未解决

当然是
main()
基本上是-当您在网页中加载脚本并执行时(是的,这可能会发生多次)。或者告诉节点执行的全局程序。一旦代码完成运行,它确实会从堆栈中弹出,正如您在对话的动画中所看到的那样。它不会“继续运行”,因为这会阻塞事件循环

我在这里的理由是,如果是,那么JS程序将完成,并且不会发生回调

否。脚本可能已完成,是的,但您的程序(浏览器环境、节点等)尚未完成。事件循环仍在旋转(或者确切地说,只是开始旋转)

事件循环将查看正在进行的异步任务(XHR、超时、文件IO等),并注意到仍有一些事情在工作。程序不会退出。一旦这些任务中的一个(或多个)完成,他们就将回调放入回调队列,事件循环在那里拾取回调,并通过在全新的调用堆栈上执行回调来处理回调。当堆栈再次为空时,事件循环将重新处于控制状态,并从队列中拾取回调,直到其为空。然后,再次检查是否仍有正在进行的任务(其中一个回调可能产生了新的任务),只有当没有任务时,程序才会真正结束,全局环境可能会被破坏


因此,是的,在javascript程序的执行过程中确实存在调用堆栈为空的时候,只有事件循环在愉快地旋转——实际上,大多数情况下都是这样。

该演示文稿是否在其他地方可用,只有幻灯片?我已经找到了答案,但要回答你的问题,我需要看幻灯片。或者你可以链接到演示文稿的相关部分?他在10分钟左右开始谈论调用堆栈。谢谢!因此,我假设这意味着回调队列等待将新帧推送到调用堆栈,直到只剩下一个main()帧。事实上,这是一个事件循环,负责将任务队列中剩余的回调推送到main()。如果main()死了,回调将无处结束,除非浏览器停止(或服务器,或您所在的任何环境)在进程死机时取消了与进程相关的现有计时器(我不太清楚)