为什么命名函数表达式本身不能将名称分配给另一个值?

Why Named Function Expression itself cannot assign Name to another Value?

var functionVariable = function functionExpressionName() {
    functionExpressionName = 1;
    console.log(functionExpressionName) // function
};

functionVariable();

如果你 运行 这个例子你可以看到我们不能重新分配给 functionExpressionName 任何东西。 但这也很有趣,我们可以重新声明 functionExpressionName 之后我们可以将任何内容分配给 functionExpressionName

var functionVariable = function functionExpressionName() {
    function functionExpressionName() {

    }

    functionExpressionName = 1;
    console.log(functionExpressionName); // 1
};

functionVariable();

如果启用严格模式,错误会变得更清楚:

'use strict';
var functionVariable = function functionExpressionName() {
    functionExpressionName = 1;
    console.log(functionExpressionName) // function
};

functionVariable();

Uncaught TypeError: Assignment to constant variable

函数名在函数内部是un-reassignable,但是可以在函数内部创建一个new同名变量body。一种看待它的方法是在函数 body:

之外用 const 声明函数名称
var functionVariable = (() => {
  const functionExpressionName = function () {
    functionExpressionName = 1; // Clearly wrong - functionExpressionName is a const
    // but it would work if you declared a *new* variable,
    // which has a different lexical binding
    console.log(functionExpressionName) // function
  };
  return functionExpressionName; 
})();

functionVariable();

不完全会发生什么,但非常接近。