This answer ma naprawdę ładne wyjaśnienie tego, co się tutaj dzieje.
Podsumowując, JavaScript jest przetwarzany w dwóch fazach, kompilacji, a następnie wykonywania. Definicje funkcji występują podczas etapu kompilacji, więc wewnątrz b
kompilator widzi definicję function a() {}
, a lokalna zmienna a
jest tworzona w zakresie b
. Później, gdy kod zostanie wykonany, zakres b
już zawiera lokalną zmienną a
przed wykonaniem jakiegokolwiek kodu, więc linia a = 10;
po prostu nadaje zmiennej lokalnej nową wartość. Definicja funkcji została już przetworzona podczas kompilacji, więc nie będzie miała miejsca podczas wykonywania, więc console.log(a)
wyświetli 10
.
+1 za wzmiankę o "podnoszeniu" – sabithpocker
Definiuje "a" jako funkcję wewnątrz 'b', zmuszającą' a' do lokalnego do 'b', nawet bez jawnego robienia' var a'. Jaka jest magia ukrytego zasięgu lokalnego? – sabithpocker
+1 dobry przykład – John