2014-04-28 19 views
10

Czy ktoś może mi rozbić na etapy, jak to (wygląda prosty w pierwszej kolejności) jest interpretowany przez przeglądarkę:Jak działa ten prosty skrypt javascript (może być scopingiem)?

var a = 1; 
function b() { 
a = 10; 
function a() {} 
} 
b(); 
alert(a); 

przyniesie 1. Jeśli chciałbym zmienić nazwę funkcji do niczego innego, etc:

var a = 1; 
function b() { 
a = 10; 
function m() {} 
} 
b(); 
alert(a); 

będzie ostrzegać 10.

+1

Arrgh, ten przykład jest tak powszechny, że można nawet umieścić pełny kod w ulubionej wyszukiwarce i uzyskać przydatne wyniki ... – Bergi

Odpowiedz

13

zakres zmiennej zadeklarowanej z var jest cała funkcja, w której jest on ogłosił, że nie rozpocznie się w momencie deklaracji. Jest często opisywany jako variable declaration hoisting i może być postrzegany jako ruch wszystkich deklaracji zmiennych na początku funkcji. W przypadku definicji funkcji zarówno deklaracja, jak i "przypisanie" są przenoszone razem.

function b() { 
    a = 10; 
    function a() {} 
} 

jest równoważna

function b() { 
    var a = function() {}; 
    a = 10; 
} 

co oznacza zadeklarować nową zmienną a, oraz oświadczenie a = 10 zmienia tylko wewnętrzna zmienna a, a nie jeden zewnętrzny. Mówimy, że wewnętrzna zmienna przyciemnia zewnętrzną.

W drugim przypadku nie ma zmiennej a w zakresie wewnętrznym, co oznacza, że ​​zewnętrzna jest używana i zmieniana (podczas wyszukiwania zmiennej przechodzimy z zakresu wewnętrznego do najbardziej zewnętrznego po łańcuchu zamknięcia) .

Powiązane problemy