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

Why can’t I assign values to a variable inside a named function expression with the same name?

本文关键字:变量 赋值 表达式 函数 不能 为什么      更新时间:2023-09-26

这是一个命名为test的函数表达式。在内部,我将123赋值给一个同样名为test的变量。记录test日志。该函数在控制台中打印其主体,但不打印123。这种行为的原因是什么?

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

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

  1. 函数执行开始:test是一个引用函数本身的局部变量
  2. 局部变量test被重新赋值给123
  3. console.log(test)表示123

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

生产

FunctionExpression: function Identifier (FormalParameterListopt) {FunctionBody}

按如下方式求值:

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

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