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

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

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

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

解决方案

我相信这块 ecma规格 解释了这种行为。这具体涉及到 命名 函数表达式

生产

函数表达式 :函数标识符(FormalParameterListopt){FunctionBody}

被评估如下:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top