【问题标题】:Call Stack order of operations in Javascript - JS foundational conceptJavascript 中的调用堆栈操作顺序 - JS 基本概念
【发布时间】:2019-09-26 17:21:20
【问题描述】:

在运行这段代码时,JS引擎将three()、two()、one()按顺序推送到调用堆栈。 我的问题是: 字符串“I'm function ONE!!!”是否在 one() 从堆栈中弹出或在 two() 和 three() 从堆栈中弹出之后返回?

我假设“我是唯一的功能!!!”在一个从堆栈中弹出之后立即返回,而不是在每个函数从堆栈中弹出之后返回。

如果我错了,有人可以纠正我吗?

function one() {
  return "I'm function ONE!!!";
}

function two() {
  return one();
}

function three() {
  return two();
}

three();

【问题讨论】:

  • “字符串被返回”是什么意思?如下所示:输入三 -> 输入二 -> 输入一 -> 使用字符串返回二 -> 使用字符串返回一 -> 使用字符串返回全局。对吗?
  • 我将我的问题编辑得更具体。我的意思是从函数 one() 返回的字符串。

标签: javascript callstack executioncontext


【解决方案1】:

在浏览器中使用调试器检查我的代码后,我得出的结论是“我是函数 ONE!!!”在从调用堆栈中弹出每个函数(一、二和三)后返回。

所以我可能错了,“我是一个功能!!!”在调用 one() 后立即返回。

【讨论】:

  • 我认为您第一次是正确的,因为如果在调用 one() 后没有返回 onetwo() 将无法使用来自 one 的返回,那太傻了.. :)
  • @Keith 嗯,你说得很好。但是当我尝试在带有调试器的 Chrome 中运行这段代码时,“我的功能是 ONE !!!”在调用堆栈为空后打印到控制台。这让我相信所有必须从堆栈中弹出以便 one() 返回的函数。如果我错了,请纠正我。
  • 为什么"I'm function ONE!!!" 会被记录到控制台,而不是控制台记录任何东西?我不确定您要解决什么问题,但请记住 Javascript UI 是事件驱动的,因此当 Javascript 运行一些阻塞代码时,事件队列不会运行,因此任何视觉效果都会被延迟,也许这也是您的参考。
  • 我不想解决任何问题。根据我的问题,这是我试图理解的 JS 的基础。如果您在任何浏览器控制台中运行代码,它会打印到控制台。另外,我没有提到任何事件,因为上面的代码没有提到任何 Web API。我希望这能解决问题。
  • 我知道你没有使用任何事件,我从未说过你使用过。我说如果你阻止 UI,事件队列也会被阻止。您发布的代码不会在控制台上打印任何内容,我什至已将您的代码转换为可运行的 sn-p。如果我在 Chrome 中运行它,则不会像预期的那样将任何内容发送到控制台,因为您的代码没有 1 行代码可以向控制台发送任何内容。
猜你喜欢
  • 2023-04-09
  • 2015-05-10
  • 2021-04-29
  • 1970-01-01
  • 2021-07-23
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多