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.
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ą. –
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. –
dziękuję, to jest pomocne i wyjaśniające –