我有全局代码段:
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}} }}
答案 0 :(得分:3)
执行上下文包含词法环境,变量环境和此绑定。
(source)
所以,澄清一下:
with
对某些对象的属性。所以 - 回答你的问题。
如果我们查看规范,请明确说明:
创建执行上下文时,其 LexicalEnvironment 和 VariableEnvironment 组件最初具有相同的值。在执行上下文中执行代码期间,LexicalEnvironment组件的值可能会发生变化,VariableEnvironment组件的值永远不会更改。
因此,在您输入函数foo
的情况下,该过程在10.4.3中指定“输入功能代码”变量环境为:
让localEnv成为调用NewDeclarativeEnvironment的结果,将F的[[Scope]]内部属性的值作为参数传递。
将LexicalEnvironment设置为localEnv。
将VariableEnvironment设置为localEnv。
什么是[[Scope]]
?它是在创建功能时定义的,并在13.2 Creating function objects中指定。
因此,正如我们之前所说,VariableEnvironment
和LexicalEnvironment
相同,它们都有空(无绑定)声明性环境记录,以及[[scope]]
因此,[[Scope]]
的{{1}}内部属性被传递,由解析检测到并包含对foo
和a
的引用以及函数{{1本身。
答案 1 :(得分:1)
正如previous question中已经确定的那样,VariableEnvironment
和LexicalEnvironment
指的是相同的环境。但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)
即。词汇环境的环境记录有两个条目a
和b
。我不知道为什么有必要同时使用LexicalEnvironment
和VariableEnvironment
,但这就是语言的设计方式。