Имена функций, определенные как параметры для вызова функции, не отображаются. Почему бы и нет?

Рассмотрим следующий код.



  console.log(a);
  function a() {}

Заметить, чтоa по-видимому доступ до его определения. Консольный вывод: (jsfiddle)

function a() {}

Имена функций и переменных определяются перед выполнением любого другого кода, поэтому здесь работает вызов console.log. Это называетсяПодъемный.

Но это нене работает, если функция определена как параметры в вызове функции. Посмотрите на этот код.



  function a() {}
  a(function b() {});
  console.log(b);

Обратите внимание, что функцияb определяется внутри вызоваa, Не внутри замыкания, а внутри звонка. Консольный вывод: (jsfiddle) Я

Uncaught ReferenceError: b is not defined

Мне интересно, почему это происходит. Это предполагаемое поведение? Это происходит как в Chrome, так и в Firefox.

ОБНОВИТЬ: этоjsfiddle показывает, что имена в выражениях функций никогда не доступны в той области, в которой они определены. Однако имя определяется внутри области действия самой функции. Это означает, что выражение именованной функции может ссылаться на имя, но только внутри функции. Имя также сохраняется в функцииname параметр.



  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

Ответы на вопрос(3)

Ваш ответ на вопрос