2013-05-28 25 views

Odpowiedz

6

Zamówienie jest interpretowane jak pokazano poniżej ze względu na zmienne podnoszenie. Zauważ, że jak poprawnie wskazuje @ShadowCreeper, function a(){} faktycznie tworzy lokalną zmienną wewnątrz funkcji b, która jest podnoszona, jak pokazano poniżej.

var a; 
var b; 

a = 6; 
b = function() { 
var a; 
a = function(){}; 
a = 10; 
console.log(a); //10 
} 
b(); 
console.log(a); //6 
+1

+1 za wzmiankę o "podnoszeniu" – sabithpocker

+0

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

+0

+1 dobry przykład – John

2

Ponieważ tworzysz zmienną lokalną (funkcja a) następnie zastąpienie że wartość lokalnej zmiennej (the function) z 10.

Jednym ze sposobów uniknięcia takich sytuacji jest poprzedzanie wszystkich lokalnych zmiennych i funkcji za pomocą "_" (podkreślenie).

+0

coś mi mówi, że nie jest to wystarczająco poprawne. Nie spadłem, fwiw ... – xandercoded

+2

Jeśli umieścisz 'var a = 10;' na górze funkcji 'b', będziesz miał lokalną zmienną, która ukrywa globalną. Wierzę również, że 'funkcja a()' zachowuje się tak samo jak 'var a = function()' (tworzy lokalną zmienną o nazwie 'a', która jest' funkcją'). –

+0

zgodził się, niejawna lokalna deklaracja zagnieżdżonej 'funkcji a' tutaj jest kopaczem http://jsfiddle.net/AVcqr/ ... – xandercoded

2

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.