何时分配了函数的内部[[scope]]属性?

时间:2014-12-31 13:40:57

标签: javascript

只是为了清醒我的想法,如果我错了,请纠正我。好吧,让我们举个例子:

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的词汇环境)的集合,它是祖先的活动对象(如果有的话) )

这里有什么误会吗?

1 个答案:

答案 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 )