繁体   English   中英

为什么不能给具有相同名称的命名函数表达式中的变量赋值?

[英]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 );
}());

我对函数执行的解释在哪里失败?

  1. 开始执行函数: test是引用函数本身的局部变量
  2. 局部变量test重新分配给数字123
  3. console.log(test)显示数字123

我相信ecma规范的这一部分解释了这种行为。 这特别涉及命名的函数表达式

生产

FunctionExpression:函数标识符(FormalParameterListopt){FunctionBody}

评估如下:

  1. 令funcEnv为调用NewDeclarativeEnvironment的结果,并传递运行中执行上下文的词法环境作为参数
  2. 让envRec为funcEnv的环境记录。
  3. 调用envRec的CreateImmutableBinding具体方法,将Identifier的String值作为参数传递。
  4. 让闭包作为使用13.2中指定的,由FormalParameterListopt指定的参数和由FunctionBody指定的主体创建新的Function对象的结果。 传入funcEnv作为范围。 如果FunctionExpression包含在严格代码中,或者其FunctionBody是严格代码,则将Strict标志作为true传递。
  5. 调用envRec的InitializeImmutableBinding具体方法,将Identifier和String的String值作为参数传递。
  6. 返回关闭。

创建命名函数表达式的作用域时,使用CreateImmutableBinding将标识符(在本例中为test )创建为不可变变量。 这就是为什么对其赋值不会更改其值的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM