2016-11-10 12 views
5

Grałem z jakimś kodem i wpadłem na sytuację, w której nie mogłem zidentyfikować, dlaczego "let" zachowuje się tak, jak robi.Problem z let keyword

Na poniższym bloku kodu:

var x = 20; // global scope 
 

 
function f() { 
 
    let x = x || 30; 
 
} 
 

 
f(); // VM3426:1 Uncaught ReferenceError: x is not defined(…)

pojawia się błąd 'x nie jest zdefiniowana' w wykonaniu f(). Rozumiem, że zmienne "let" nie są podnoszone, ale skoro "x" ma kopię globalną, dlaczego linia wewnątrz funkcji "f" nie przyjmuje wartości globalnej zamiast rzucania błędu? Czy "pozwól" ustawić zmienną na niezadeklarowaną (zamiast "niezdefiniowaną" z var ze względu na podnoszenie) na początku funkcji? Czy istnieje sposób uzyskania globalnej kopii "x" w ramach funkcji?

+0

Możliwy duplikat [ „niech” słowa kluczowego vs „var” słowo kluczowe w JavaScript] (http://stackoverflow.com/questions/762011/let-keyword-vs-var-keyword-in-javascript) – ozil

+1

Deklaracja lokalnego 'x' jest w cieniu globalnego, ale jak Ty przypisywanie wartości na podstawie istniejącego 'x', ca kompilatora Nigdzie nie znajduj jednego, ponieważ ten jest zacieniony, a drugi nie jest jeszcze zadeklarowany. –

Odpowiedz

5

Wyjątkiem jest o prawej stroniex - podczas inicjalizacji blokowym-Scope x zmienna globalna jeden jest już „zapomniał” jednak nowy nadal nie zostały zgłoszone i nie może być stosowany w okresie inicjalizacji

Porównaj z jawne wywołanie globalnej

function f() { 
     let x = window.x || 30; 
    } 

także przyjrzeć this MDN article o niech martwe strefy

+1

Więc mówimy, że ta część 'let x' jest obliczana jako pierwsza, a lokalna zmienna' x' jest tworzona, ale nie została zadeklarowana (tak, że globalne x jest zacienione), a następnie ta część jest wykonywana 'x || 30 "i" x "nie znaleziono? –

+0

Tak dokładnie - tak się dzieje –

+0

dziękuję, zastanawiam się, jak ten proces "utworzono, ale nie zadeklarowałem" nazywa się –

0

Pozwól, aby zgłosiła zmienne o ograniczonym zakresie do bloku, instrukcji lub wyrażenia, w których jest używany. Jest to przeciwieństwo słowa kluczowego var, które definiuje zmienną globalnie lub lokalnie dla całej funkcji, niezależnie od zakresu bloku.

Tutaj, w twoim przypadku, zostanie zgłoszony wyjątek, ponieważ definiujesz let z tą samą nazwą.

For More Info

+0

To nie powinno stanowić problemu, wewnątrz funkcji należy użyć 'let' x, poza' var' –

0

Deklaracja lokalnego X jest shadowing globalny i nowy nie jest jeszcze ogłoszony pierwszy i nie może być stosowany w czasie inicjalizacji. Jest to taka sama sytuacja jak następuje:

var foo = 5; 
    function do_something() { 
     console.log(foo); // ReferenceError 
     let foo = 2; 
    } 
    do_something(); 

Dla porównania MDN

Jak sugeruje @ m.antkowicz można użyć window.x w Twoim przypadku.