gpt4 book ai didi

javascript - JS 调用堆栈总是至少有一个框架吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:34:01 25 4
gpt4 key购买 nike

我最近看到一个presentation on the JS event loop坦率地说,这很棒,但我现在对 JS 调用堆栈有一个挥之不去的问题。如果您将全局执行上下文视为 main(),那么 main() 是否从未解析过?我的理由是,如果是,那么 JS 程序将完成,并且不会发生任何回调。

--编辑

我在这里的主要兴趣是与回调队列相关的调用堆栈的表示方式。如果说事件循环在将新帧插入堆栈之前等到调用堆栈为空,那么循环将一直等到程序完成,并且回调不会有任何效果。

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

最佳答案

If you think about the global execution context as, say, main()

没有。 main 不是 global execution context ,它是最初在该上下文中运行的代码。在您的全局代码运行后,全局环境 - 通过闭包 - 仍然保留用于未完成的回调,在您的程序完成之前它不会被垃圾收集。

is main() never resolved?

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

My reasoning here is that, if it were, then the JS program would be complete, and no callbacks would happen.

没有。脚本可能已经完成,是的,但是你的程序(浏览器环境、节点等)还没有。事件循环仍在旋转(或者,准确地说:刚刚开始旋转)。

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

是的,在执行 javascript 程序时确实存在调用堆栈为空且只有事件循环在愉快地旋转的 javascript 程序的情况 - 事实上,大多数时候都是这种情况。

关于javascript - JS 调用堆栈总是至少有一个框架吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27529328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com