8

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

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

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

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

1 回答 1

5

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

生产

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

评估如下:

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

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

于 2014-06-03T18:09:51.577 回答