function foo() {
var x = 1;
return function bar() {
console.log(x);
};
}
var b = foo();
b();
按代码执行foo
代码时,控件流程为function bar()
,根据我的理解,这是指定bar.[[scope]]
的时刻。 foo
的执行上下文中的scopeChain被复制到bar.[[scope]]
,它是foo
的活动对象(来自每个ecma5的词汇环境)的集合,它是祖先的活动对象(如果有的话) )
这里有什么误会吗?
答案 0 :(得分:1)
对,创建函数时分配bar
的{{1}};这是§13.2 ("Creating Function Objects")中的第9步。
您是正确的,在这种情况下,当您按照代码的分步顺序到达时,会创建[[scope]]
bar
...因为您正在使用命名函数表达式。 (如果它是一个函数声明,它不会在逐步的代码中,但那是另一回事。)
return function bar() {
的{{1}}设置为词汇环境,该词汇环境在创建bar
的时间/地点时处于活动状态。在你的代码中,这是函数表达式的词汇环境,它也与当前调用[[scope]]
的变量环境相同(因为没有像bar
那样有趣的业务)这包括由§13讨论生产
FunctionExpression :foo
标识符 with
FormalParameterListopt function
(
FunctionBody )