创建执行上下文后变量和词法环境的值

时间:2013-12-21 17:27:16

标签: javascript

我有全局代码段:

function foo(){
    var a={a:'a'};
    var b={b:'b'};
}

创建Variable/LexicalEnvironment执行上下文后foo的值是多少?我认为VariableEnvironment的{​​{1}}必须包含绑定environment record,但foo--> function(){ }, a-->{a: 'a'}, b-->{b: 'b'}的{​​{1}}必须包含LexicalEnvironment的{​​{1}} }}

2 个答案:

答案 0 :(得分:3)

执行上下文包含词法环境,变量环境和此绑定。

enter image description heresource

所以,澄清一下:

  • 执行上下文包含词法环境和可变环境
  • 他们是不同的东西。
  • Environment包含两种类型的环境记录
    • 声明性环境记录 - 这些直接将标识符与语言值相关联。
    • 对象环境记录 - 它们定义了ecmascript元素的效果(例如with对某些对象的属性。

所以 - 回答你的问题。

如果我们查看规范,请明确说明:

  

创建执行上下文时,其 LexicalEnvironment VariableEnvironment 组件最初具有相同的值。在执行上下文中执行代码期间,LexicalEnvironment组件的值可能会发生变化,VariableEnvironment组件的值永远不会更改。

因此,在您输入函数foo的情况下,该过程在10.4.3中指定“输入功能代码”变量环境为:

  

让localEnv成为调用NewDeclarativeEnvironment的结果,将F的[[Scope]]内部属性的值作为参数传递。

     

将LexicalEnvironment设置为localEnv。

     

将VariableEnvironment设置为localEnv。

什么是[[Scope]]?它是在创建功能时定义的,并在13.2 Creating function objects中指定。

因此,正如我们之前所说,VariableEnvironmentLexicalEnvironment 相同,它们都有(无绑定)声明性环境记录,以及[[scope]]

的环境外部词汇环境参考

因此,[[Scope]]的{​​{1}}内部属性被传递,由解析检测到并包含对fooa的引用以及函数{{1本身。

答案 1 :(得分:1)

正如previous question中已经确定的那样,VariableEnvironmentLexicalEnvironment指的是相同的环境。但LexicalEnvironment引用的环境可能会在执行函数期间更改。来自spec

  

创建执行上下文时,其LexicalEnvironment和VariableEnvironment组件最初具有相同的值。在执行上下文中执行代码期间,LexicalEnvironment组件的值可能会发生变化,VariableEnvironment组件的值永远不会更改。

所以这是foo即将被执行时发生的事情,在JavaScript-ish伪代码中:

// foo.[[scope]] refers to the global lexical environment
lovalEnv = new NewDeclarativeEnvironment(foo.[[scope]])
LexicalEnvironment = localEnv
VariableEnvironment = localEnv

env = VariableEnvironment.envRec
env.CreateMutableBinding('a', false)
env.SetMutableBinding('a', undefined, false)
env.CreateMutableBinding('b', false)
env.SetMutableBinding('b', undefined, false)

即。词汇环境的环境记录有两个条目ab。我不知道为什么有必要同时使用LexicalEnvironmentVariableEnvironment,但这就是语言的设计方式。