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
To _evil_. – SLaks