2010-11-18 5 views
5

ECMAScript jest dość prosty o var. Jeśli nie używasz var wewnątrz funkcji, aby zadeklarować zmienną, którą przypiszesz, przypisz do zasięgu globalnego. Dzieje się tak ze względu na sposób działania łańcucha zasięgu. Środowisko wykonawcze szuka identyfikatora w zasięgu lokalnym, a następnie przesuwa się w górę, aż osiągnie zasięg globalny. Jeśli nie znaleziono deklaracji dla identyfikatora i nie została zidentyfikowana jako argument, zmienna jest tworzona w zasięgu globalnym.Dlaczego zmienna globalna nie jest zmieniana w pewnych okolicznościach w funkcji, jeśli nie zadeklarujesz jej z var lub nie jest to argument?

Na przykład zakres lokalny:

var car = 'Blue'; 

function change_color() { 
    var car = 'Red'; 
} 
change_color(); 
console.log(car); //logs 'Blue' as car is in the local scope of the function. 

Kiedy car nie znajduje się w lokalnym zakresie:

var car = 'Blue'; 
function change_color() { 
    car = 'Red'; 
} 
change_color(); 
console.log(car); 
//logs 'Red' as car is not in the local scope and the global variable is used. 

Teraz najwyraźniej istnieje wyjątek od tej reguły, że nie był świadomy i don Zrozumieć (), zauważ nazwę funkcji):

var car = 'Blue'; 
(function car() { 
car = 'Red'; 
})(); 
console.log(car); //Logs 'Blue'???? 

Czy ktoś może to wyjaśnić? Nie widzę, gdzie jest to wyjaśnione w ECMASpec. Przetestowano w przeglądarce Chrome 8 i Firefox 3.6

+6

To _evil_. – SLaks

Odpowiedz

6

A named function expression (w przeciwieństwie do funkcji , deklaracja) tworzy nazwę, która jest dostępna tylko w zakresie funkcji.

Wyrażenie (bez deklaracji) formularza (function foo() { ... }) tworzy identyfikator o nazwie foo, który istnieje tylko wewnątrz funkcji.
Dlatego, gdy przypisujesz do foo w funkcji, przypisujesz do tego lokalnego identyfikatora.

przypadku zmiany funkcji w deklaracji funkcji, to będzie działać zgodnie z oczekiwaniami:

var car = 'Blue'; 
function car() { 
    car = 'Red'; 
} 
car(); 
console.log(car); //Logs 'Red' 
+0

Nauczyłem się jeszcze jednej rzeczy na temat JavaScript dzisiaj. Dziękuję Ci. –

+0

To deklaracja funkcji, a nie instrukcja funkcji. W przeciwnym razie dobra odpowiedź. –

Powiązane problemy