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>