为什么我不能为同名命名函数表达式内的变量赋值?

问题描述 投票:0回答:1

这是一个名为

test
的命名函数表达式。在内部,我将
123
分配给一个变量,也称为
test
。然后记录
test
。该函数在控制台中打印其主体,但不打印
123
。这种行为的原因是什么?

(function test() {
  test = 123;
  console.log( test );
}());

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

  1. 函数执行开始:
    test
    是引用函数本身的局部变量
  2. 局部变量
    test
    重新分配给数字
    123
  3. console.log(test)
    显示数字
    123
javascript function scope
1个回答
5
投票

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

相关

制作

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

评价如下:

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

在创建命名函数表达式的范围时使用

CreateImmutableBinding
,将标识符(在本例中为
test
)创建为不可变变量。这就是为什么对它的赋值不会改变它的值。

© www.soinside.com 2019 - 2024. All rights reserved.