[英]Why can’t I assign values to a variable inside a named function expression with the same name?
这是一个名为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的环境记录。
- 调用envRec的CreateImmutableBinding具体方法,将Identifier的String值作为参数传递。
- 让闭包作为使用13.2中指定的,由FormalParameterListopt指定的参数和由FunctionBody指定的主体创建新的Function对象的结果。 传入funcEnv作为范围。 如果FunctionExpression包含在严格代码中,或者其FunctionBody是严格代码,则将Strict标志作为true传递。
- 调用envRec的InitializeImmutableBinding具体方法,将Identifier和String的String值作为参数传递。
- 返回关闭。
创建命名函数表达式的作用域时,使用CreateImmutableBinding
将标识符(在本例中为test
)创建为不可变变量。 这就是为什么对其赋值不会更改其值的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.