(function test() {
test = 123;
console.log( test );
}());
此功能在控制台中打印它的身体,但不是{ 123'。这种行为的原因是什么?
我对函数执行的解释失败了吗?
答案 0 :(得分:5)
我相信ecma spec的这一部分解释了这种行为。这与命名函数表达式
具体相关制作
FunctionExpression:function Identifier(FormalParameterListopt){FunctionBody}
评估如下:
- 让funcEnv成为调用NewDeclarativeEnvironment的结果,将正在运行的执行上下文的词法环境作为参数传递
- 让envRec成为funcEnv的环境记录。
- 调用envRec的CreateImmutableBinding具体方法,将Identifier的String值作为参数传递。
- 让闭包是创建一个新的Function对象的结果,该对象在13.2中指定,其中参数由FormalParameterListopt指定,并且由FunctionBody指定。传入funcEnv作为范围。如果FunctionExpression包含在严格的代码中或者其FunctionBody是严格的代码,则传入true作为Strict标志。
- 调用envRec的InitializeImmutableBinding具体方法,将Identifier和closure的String值作为参数传递。
- 返回封闭。
醇>
在创建命名函数表达式的范围时使用CreateImmutableBinding
会将标识符(在本例中为test
)创建为不可变变量。这就是为什么赋值不会改变它的价值。