【问题标题】:When does a function get added to the call stack?什么时候将函数添加到调用堆栈中?
【发布时间】:2014-11-24 12:11:50
【问题描述】:

假设我们在全局范围内执行了一系列函数,如下所示:

function second() {}

function first() {
  second();
}

first();

first何时被添加到调用堆栈?

它是在调用时添加的,还是在 它调用 second 之后添加的(并且执行上下文现在在 second 内) ?

【问题讨论】:

  • 我会说:当它实际被调用时。
  • 在顶部放一个debugger; 语句,单步执行代码并观察调用堆栈的增长。
  • 有关调用堆栈(以及闭包如何相关)的长时间讨论,请参阅此不相关问题的答案:stackoverflow.com/questions/26061856/…

标签: javascript function callstack


【解决方案1】:

一个函数被“添加到堆栈中”当它被调用。虽然 ECMAScript 第 5 版中没有指定“调用堆栈”实现,但它确实在 10.3 Execution Contexts 中定义了虚拟行为:

当控制权转移到 ECMAScript 可执行代码时,控制权正在进入执行上下文。活动执行上下文在逻辑上形成一个堆栈。 此逻辑堆栈上的顶部执行上下文是正在运行的执行上下文 [即。当前运行的函数]。每当控制从与当前运行的执行上下文关联的可执行代码转移到与该执行上下文无关的可执行代码时,就会创建一个新的执行上下文。 新创建的执行上下文被压入堆栈,成为正在运行的执行上下文。

从技术上讲,堆栈的一部分不是函数,而是通过调用函数创建的执行上下文。

这也符合更一般的Call Stack 概念,其中 active/current 函数上下文也是堆栈的一部分。

在计算机科学中,调用堆栈是一种堆栈数据结构,存储有关计算机程序的活动子例程的信息 [包括当前正在运行的子例程] .. 详细信息通常隐藏在高级编程语言..

使用此定义还可以确保函数永远不会“脱离堆栈”运行 - 这与其他语言/环境 和 JavaScript 开发工具的这种概念一致。

【讨论】:

  • 感谢您的详细解释,这很有道理。
【解决方案2】:
function second() {/* 3rd code here will be executed once second is called */}

function first() {
  // 2nd code here will be executed before second(); is called
  second();
  // 4th code here will be executed after second(); is called and all its code has been executed
}

// 1st code here will be executed before anything is called
first();
// 5th code here will be executed when everything has been called.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2020-10-21
    • 2012-08-13
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多