这是一个名为
test
的命名函数表达式。在内部,我将 123
分配给一个变量,也称为 test
。然后记录 test
。该函数在控制台中打印其主体,但不打印 123
。这种行为的原因是什么?
(function test() {
test = 123;
console.log( test );
}());
我对函数执行的解释哪里失败了?
test
是引用函数本身的局部变量test
重新分配给数字123
console.log(test)
显示数字 123
。我相信 ecma 规范 的这一部分解释了这种行为。这特别与命名函数表达式
相关制作
FunctionExpression:函数标识符(FormalParameterListopt){FunctionBody}
评价如下:
- 令 funcEnv 为调用 NewDeclarativeEnvironment 并传递运行执行上下文的词法环境作为参数的结果
- 设 envRec 为 funcEnv 的环境记录。
- 以 Identifier 的 String 值作为参数,调用 envRec 的 CreateImmutableBinding 具体方法。
- 令闭包为创建一个新的 Function 对象的结果,如 13.2 中所指定,其参数由 FormalParameterListopt 指定,主体由 FunctionBody 指定。传入 funcEnv 作为范围。如果 FunctionExpression 包含在严格代码中或其 FunctionBody 是严格代码,则传入 true 作为 Strict 标志。
- 以 Identifier 的 String 值和闭包作为参数,调用 envRec 的 InitializeImmutableBinding 具体方法。
- 返回关闭。
在创建命名函数表达式的范围时使用
CreateImmutableBinding
,将标识符(在本例中为 test
)创建为不可变变量。这就是为什么对它的赋值不会改变它的值。