Funktionsnamen, die als Parameter für einen Funktionsaufruf definiert sind, werden nicht gehisst. Warum nicht?

Betrachten Sie den folgenden Code.

<!DOCTYPE html>
<script>
  console.log(a);
  function a() {}
</script>

Beachte dasa wird anscheinend aufgerufen, bevor es definiert wird. Die Konsolenausgabe ist: (jsfiddle)

function a() {}

Funktions- und Variablennamen werden definiert, bevor anderer Code ausgeführt wird, sodass der Aufruf console.log hier funktioniert. Das nennt manhochziehen.

Dies funktioniert jedoch nicht, wenn die Funktion als Parameter in einem Funktionsaufruf definiert ist. Schau dir diesen Code an.

<!DOCTYPE html>
<script>
  function a() {}
  a(function b() {});
  console.log(b);
</script>

Beachten Sie, dass die Funktionb wird innerhalb eines Aufrufs an definierta. Nicht innerhalb eines Abschlusses, sondern innerhalb eines Anrufs. Die Konsolenausgabe ist: (jsfiddle)

Uncaught ReferenceError: b is not defined

Ich frage mich, warum das passiert. Ist das das beabsichtigte Verhalten? Dies geschieht sowohl in Chrome als auch in Firefox.

AKTUALISIEREN: Diesejsfiddle zeigt, dass Namen in Funktionsausdrücken niemals in dem Bereich verfügbar sind, in dem sie definiert sind. Der Name wird jedoch innerhalb des Funktionsumfangs selbst definiert. Dies bedeutet, dass ein benannter Funktionsausdruck auf den Namen verweisen kann, jedoch nur innerhalb der Funktion. Der Name wird auch in der Funktion gespeichertname Parameter.

<!DOCTYPE html>
<script>
  console.log(a); // undefined
  var a = function b() {
    console.log(b); // function b() { … };
  };
  a(); // function b() { … };
  console.log(a); // function b() { … };
  console.log(a.name); // b
  console.log(b); // Uncaught ReferenceError: b is not defined
</script>

Antworten auf die Frage(3)

Ihre Antwort auf die Frage