Имена функций, определенные как параметры для вызова функции, не отображаются. Почему бы и нет?
Рассмотрим следующий код.
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