我相信这部分ecma 规范解释了这种行为。这与命名 函数表达式特别相关
生产
FunctionExpression:函数标识符(FormalParameterListopt){FunctionBody}
评估如下:
- 让 funcEnv 成为调用 NewDeclarativeEnvironment 的结果,传递运行执行上下文的词法环境作为参数
- 设 envRec 为 funcEnv 的环境记录。
- 调用 envRec 的 CreateImmutableBinding 具体方法,传入 Identifier 的 String 值作为参数。
- 让闭包是创建一个新的函数对象的结果,如 13.2 中指定的,其参数由 FormalParameterListopt 指定,主体由 FunctionBody 指定。传入 funcEnv 作为 Scope。如果 FunctionExpression 包含在严格代码中或其 FunctionBody 是严格代码,则传入 true 作为 Strict 标志。
- 调用 envRec 的 InitializeImmutableBinding 具体方法,传递 Identifier 的 String 值和闭包作为参数。
- 返回关闭。
CreateImmutableBinding
在创建命名函数表达式的范围时使用,将标识符(在本例中test
)创建为不可变变量。这就是为什么分配给它不会改变它的价值。