ES6中的块和执行环境

时间:2015-04-20 13:37:33

标签: javascript ecmascript-6

在ES6中,每个块都与LexicalEnvironment相关联,以支持该语言版本的块范围功能。

这是否意味着在ES6中为每个块实例化了一个新的ExecutionContext

参考:http://globaldev.co.uk/2013/09/es6-part-2/

例如(我故意使用函数范围的var):

function foo() {

  {
    var foo; // Has a new ExecutionContext been instantiated here? 
  }

}

规范的相关位:https://people.mozilla.org/~jorendorff/es6-draft.html#sec-block-runtime-semantics-evaluation

2 个答案:

答案 0 :(得分:3)

不,每个功能只有一个执行环境。 The LexicalEnvironment simply temporarily replaces the current LexicalEnvironment

  
      
  1. oldEnv 成为正在运行的执行上下文的LexicalEnvironment。
  2.   
  3. blockEnv 成为NewDeclarativeEnvironment(oldEnv)。   执行BlockDeclarationInstantiation(StatementList,blockEnv)。
  4.   
  5. 将正在运行的执行上下文的LexicalEnvironment设置为 blockEnv
  6.   
  7. blockValue 成为评估StatementList的结果。
  8.   
  9. 将正在运行的执行上下文的LexicalEnvironment设置为 oldEnv
  10.   
  11. 返回 blockValue
  12.   

答案 1 :(得分:0)

  

这是否意味着在ES6中实例化了一个新的ExecutionContext   每个街区?

不,我不相信这是事实。

根据我对规范的阅读,在执行块的过程中,当前LexicalEnvironment的{​​{1}}暂时被为块实例化的ExecutionContext替换。在控制离开块之前恢复LexicalEnvironment