为什么我不能为具有相同名称的命名函数表达式内的变量赋值?
-
21-12-2019 - |
题
这是一个具有名称的命名函数表达式 test
.里面,我分配 123
到一个变量,也命名 test
.然后 test
被记录。该函数在控制台中打印其主体,但不 123
.这种行为的原因是什么?
(function test() {
test = 123;
console.log( test );
}());
我对函数执行的解释在哪里失败?
- 函数执行开始:
test
是引用函数本身的局部变量 - 局部变量
test
被重新分配给数字123
console.log(test)
显示数字123
.
解决方案
我相信这块 ecma规格 解释了这种行为。这具体涉及到 命名 函数表达式
生产
函数表达式 :函数标识符(FormalParameterListopt){FunctionBody}
被评估如下:
- 让funcEnv是调用NewDeclarativeEnvironment传递正在运行的执行上下文的词法环境作为参数的结果
- 让envRec成为funcEnv的环境记录。
- 调用envRec的CreateImmutableBinding具体方法,将Identifier的字符串值作为参数传递。
- 让闭包是创建一个新的函数对象的结果,如13.2中指定的,参数由FormalParameterListopt指定,体由FunctionBody指定。传入funcEnv作为作用域。如果FunctionExpression包含在严格代码中,或者其FunctionBody是严格代码,则传入true作为严格标志。
- 调用envRec的InitializeImmutableBinding具体方法,将Identifier和closure的字符串值作为参数传递。
- 返回关闭。
使用 CreateImmutableBinding
创建命名函数表达式的作用域时,创建标识符(在本例中 test
)作为不可变变量。这就是为什么对它的赋值不会改变它的值。
不隶属于 StackOverflow