0

function callDad () {
  var numb = '0122822122';
  console.log('Calling ' + numb);
}

callDad();

1) 由于函数callDad是全局声明的,因此在调用之前将其保存在全局执行上下文中。
2) 一旦函数callDad被调用,就会创建一个新的执行上下文并在堆栈上执行。

问题:在全局执行上下文中对函数的原始引用会发生什么?该函数是否在内存中存储了两次?

附加问答(供参考)

问:@Bergi 感谢您的回复。我认为问题应该是:由于全局执行上下文已经将函数存储在内存中。为什么新的执行上下文会有新的创建阶段?谢谢

A:@Ash 创建阶段是针对被调用函数体内的变量,具体在你的例子中是 numb

问:@Rodrigo 那么一旦函数被调用,它是从窗口对象中引用的吗?既然函数声明已经存在内存中的引用和创建阶段,那么为什么他们说每个新的执行上下文都有一个新的创建阶段呢?

A: 是的,函数总是从窗口对象中引用。执行上下文只是范围和范围链(闭包中其他范围的变量)。一旦创建了执行上下文,创建阶段就会为该上下文中的变量分配内存。哦,记住,在 JS 中,你有函数作用域,而不是块作用域。

4

2 回答 2

2

在全局执行上下文中对函数的原始引用会发生什么?

没有什么。它通常只存储一次。

(当针对不同的参数类型多次存储解析和优化的函数时,可能会有一些例外,但这是特定于实现的,超出了这个问题)


该函数是否在内存中存储了两次?

不会。但是函数的执行上下文会被多次存储(和处理)——就像你调用函数一样频繁。

于 2018-11-20T13:15:14.353 回答
0

在浏览器环境中(但不是在 Node.js 中),该函数将附加到window对象上,因此它只创建一次,并保留在那里。所以对函数的引用保持不变。

于 2018-11-20T13:03:14.350 回答