假设我们在全局范围内执行了一系列函数,如下所示:
function second() {}
function first() {
second();
}
first();
什么时候第一次被添加到调用堆栈?
它是在调用时添加的,还是在调用 second 之后添加(并且执行上下文现在位于 second 之内) )?
答案 0 :(得分:3)
将一个函数添加到堆栈中#34; 当被调用时。一个"调用堆栈"在ECMAScript第5版中没有指定实现,它确实在10.3 Execution Contexts中定义了虚拟行为:
当控制转移到ECMAScript可执行代码时,控制进入执行上下文。活动执行上下文在逻辑上形成堆栈。 此逻辑堆栈上的最高执行上下文是正在运行的执行上下文[即。每当控件从与当前运行的执行上下文关联的可执行代码传输到与该执行上下文无关的可执行代码时,就会创建新的执行上下文。 新创建的执行上下文被压入堆栈并成为正在运行的执行上下文。
技术上,它不是堆栈的一部分,而是通过调用函数创建的执行上下文。
这也符合更一般的Call Stack概念,其中 active / current 函数上下文也是堆栈的一部分。
在计算机科学中,调用堆栈是一种堆栈数据结构,它存储有关计算机程序的活动子程序 [包括当前运行的子程序]的信息。细节通常是隐藏的并且是自动的高级编程语言..
使用此定义还可以确保函数永远不会在堆栈中运行" - 这与其他语言/环境和 JavaScript开发人员工具的概念一致。
答案 1 :(得分:1)
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.