Nazwy funkcji zdefiniowane jako parametry wywołania funkcji nie są podnoszone. Dlaczego nie?

Rozważ następujący kod.

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

Zauważ, żea jest pozornie dostępny, zanim zostanie zdefiniowany. Wyjście konsoli to: (jsfiddle)

function a() {}

Nazwy funkcji i zmiennych są definiowane przed uruchomieniem jakiegokolwiek innego kodu, więc działa tutaj wywołanie console.log. To się nazywapodnośnik.

Ale to nie działa, jeśli funkcja jest zdefiniowana jako parametry w wywołaniu funkcji. Spójrz na ten kod.

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

Zauważ, że funkcjab jest zdefiniowany wewnątrz połączenia doa. Nie wewnątrz zamknięcia, ale wewnątrz połączenia. Wyjście konsoli to: (jsfiddle)

Uncaught ReferenceError: b is not defined

Zastanawiam się, dlaczego tak się dzieje. Czy to jest zamierzone zachowanie? Dzieje się tak w Chrome i Firefox.

AKTUALIZACJA: Tojsfiddle pokazuje, że nazwy w wyrażeniach funkcji nigdy nie są dostępne w zakresie, w jakim zostały zdefiniowane. Nazwa jest jednak zdefiniowana w zakresie samej funkcji. Oznacza to, że nazwane wyrażenie funkcji może odwoływać się do nazwy, ale tylko wewnątrz funkcji. Nazwa jest również przechowywana w funkcjiname parametr.

<!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>

questionAnswers(3)

yourAnswerToTheQuestion