2012-08-13 13 views
7

Uczę Javascript użyciu Object-Oriented JavaScript by Stoyan StefanovZrozumienie Globalne & Local Scope w JavaScript

oferuje on przykład porównując globalny i lokalny zakres:

var a = 123; 
function f() { 
    alert(a); 
    var a = 1; 
    alert(a); 
} 
f(); 

Patrząc na ten przykład, spodziewałem pierwszego wpisu do być "123", a drugi wpis "1". I oto, Stoyan mówi:

Można oczekiwać, że pierwszy alert() spowoduje wyświetlenie 123 (wartość zmienna globalna a) i drugi pokaże 1 (lokalna a). Tak nie jest. Pierwszy alert wyświetli "niezdefiniowany". Jest to , ponieważ wewnątrz funkcji zasięg lokalny jest ważniejszy niż zasięg globalny . Tak więc zmienna lokalna zastępuje dowolną zmienną globalną nazwą o tej samej nazwie. W czasie pierwszego alertu() a nie został jeszcze zdefiniowany (stąd wartość niezdefiniowana), ale nadal istniał w przestrzeni lokalnej.

Wyjaśnienie nie było dla mnie jasne, w jaki sposób zmienna lokalna może zastąpić zmienną globalną w pierwszym alarmie? Wszelkie inne/inne wyjaśnienia byłyby mile widziane.

Odpowiedz

8

Nie zastępuje zmiennej globalnej. To, co się dzieje, nazywa się "zmiennym podnoszeniem". Oznacza to, że var a; zostanie wstawiony w górnej części funkcji.

Silnik skrypt zmienia swój skrypt być następujące:

var a = 123; 
function f() { 
    var a; 
    alert(a); 
    a = 1; 
    alert(a); 
} 
f(); 

lekcja: Zawsze deklarować zmiennych przed ich użyciem. Niektórzy powiedzą, że zadeklaruj wszystkie swoje zmienne u góry funkcji.

+0

Thanks Juan. Zgaduję, że miałbyś problem z używaniem terminu "nadpisywanie" przez autorów? Zacząłem myśleć, że jest to niewłaściwe b/c, jeśli wywołam alert (a) poza funkcją, dostaję "123", co sugeruje brak nadpisania, ale dwie zmienne "a", jedną globalną i jedną lokalną. –

+3

Zastąpienie nie jest poprawnym terminem, lokalna zmienna ** cienie ** jest zmienną globalną, ale prawdziwym problemem jest zrozumienie, że jeśli masz 'var' w dowolnym miejscu w obrębie funkcji, globalny jest ** zacieniony ** w całym cała funkcja, nawet zanim zostanie zadeklarowana. –

+0

dziękuję, to jest pomocne i wyjaśniające –

1

W prostych słowach wszystkie deklaracje, zarówno zmiennych, jak i funkcji, są traktowane jako pierwsze. Tak więc lokalna var a w efekcie nadpisze globalną zmienną tylko w zasięgu lokalnym i nie będzie miała żadnej wartości, tj. undefined. Pierwszy alert wyświetli undefined. Drugi alert wyświetli 1, tak jak po a = 1. To się dzieje lokalnie, a zmienna globalna ma wartość 123 - nie zostanie zmieniona.

kolejny przykład za pomocą funkcji, aby pokazać jak to działa

function show(){ 
    alert("I am global"); 
} 

function f() { 

    show(); 

    show = function(){ 
     alert("I am second"); 
    } 

    show(); 

    function show(){ 
     alert("I am first"); 
    } 

} 
f(); 
show(); 
+0

Nie widzę, jak ten przykład pomaga zrozumieć zmienne podnoszenie, nie masz nawet lokalnego var. Słowa w odpowiedzi wydają się poprawne (choć mylące), ale ten przykład sprawia, że ​​jest to dodatkowe mylące –

Powiązane problemy