为什么不能重新分配函数表达式的名称?

时间:2019-07-04 08:02:22

标签: javascript function

以下代码段为什么会引发错误?

"use strict";
(function a() {
  console.log(typeof a); // function
  console.log(a = 0); // error
})();

为什么此代码段不会引发错误?

"use strict";
(function() {
  function a() {
    console.log(a = 0); // 0
  }
  return a;
})()();

为什么立即返回该函数会引发错误?

"use strict";
(function() {
  return function a() {
    console.log(a = 0); // error
  };
})()();

函数表达式是否仅在这种情况下发生?为什么不能重新分配他们?

1 个答案:

答案 0 :(得分:5)

这是因为命名为FunctionExpressions的行为,这与 FunctionDeclarations 的行为

不同

create a named FunctionExpression are的规则:

  

FunctionExpression:functionBindingIdentifier(FormalParameters){FunctionBody}

     
      
  1. 让范围成为正在运行的执行上下文的LexicalEnvironment。
  2.   
  3. 让funcEnv成为NewDeclarativeEnvironment(范围)。
  4.   
  5. 让envRec成为funcEnv的EnvironmentRecord。
  6.   
  7. 将其命名为BindingIdentifier的StringValue。
  8.   
  9. 执行envRec.CreateImmutableBinding(name,false)。
  10.   
  11. 让闭包成为FunctionCreate(Normal,FormalParameters,FunctionBody,funcEnv)。
  12.   
  13. 执行MakeConstructor(关闭)。
  14.   
  15. 执行SetFunctionName(闭包,名称)。
  16.   
  17. 将闭包设置为[[SourceText]]为与FunctionExpression匹配的源文本。
  18.   
  19. 执行envRec.InitializeBinding(名称,闭包)。
  20.   
  21. 返回闭包。
  22.   

重点是 .5 ,它确实使函数的名称成为immutable binding


  • 在第一种情况下,您尝试重新分配此不可变绑定抛出

  • 在第二种情况下,您命名的函数不是 FunctionExpression ,而是 FunctionDeclaration ,它具有different behavior

  • 在最后一种情况下,它是 FunctionExpression ,在这方面与第一个相同。