JavaScript全局执行上下文

时间:2018-11-20 12:47:51

标签: javascript executioncontext

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

callDad();

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

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

其他问题(仅供参考)

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

A:@Ash创建阶段用于被调用函数体内的变量,在您的示例中特别是numb

Q:@Rodrigo那么,一旦调用该函数,就可以从窗口对象中对其进行引用?由于内存中的引用和函数声明的创建阶段已经存在,那么为什么他们说每个新的执行上下文都有一个新的创建阶段?

A:是的,该函数始终从窗口对象中引用。执行上下文只是作用域和作用域链(闭包中其他作用域的变量)。创建执行上下文后,创建阶段将为该上下文内的变量分配内存。哦,请记住,在JS中,您具有函数作用域,而不是块作用域。

2 个答案:

答案 0 :(得分:2)

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

什么都没有。通常仅将它们存储一次。

(当针对不同的参数类型多次存储经过分析和优化的函数时,可能会有一些例外,但这是特定于实现的,不在此问题范围之内)

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

不。但是,函数的执行上下文会被多次存储(和处置)-与调用函数的次数相同。

答案 1 :(得分:0)

在浏览器环境中(而不是在Node.js中),该函数将附加到window对象,因此该函数仅创建一次,并停留在该位置。因此,对该函数的引用保持不变。