函数体和函数本身的变量具有相同的名称(JavaScript)

时间:2014-06-03 17:33:56

标签: javascript

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

此功能在控制台中打印它的身体,但不是{ 123'。这种行为的原因是什么?

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

  1. 开始执行功能; '测试'是一个引用函数本身的局部变量;
  2. 本地变量' test'被重新分配到第123号;
  3. console.log变量' test',这是一个数字。

1 个答案:

答案 0 :(得分:5)

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

具体相关
  

制作

     

FunctionExpression:function Identifier(FormalParameterListopt){FunctionBody}

     

评估如下:

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

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