Nie rozumiem, dlaczego zmienne działają tak dziwnie, gdy są deklarowane w funkcji.
W
first
funkcji deklarujęlet
zmiennymib
ic
wartością 10 :b = c = 10;
W
second
funkcji pokazuję:b + ", " + c
A to pokazuje:
10, 10
Również w
first
funkcji deklarujęa
wartością 10 :let a = b = c = 10;
Ale w
second
funkcji pokazuje błąd:Nie można znaleźć zmiennej:
a
Teraz w
first
funkcji deklarujęd
z wartością 20 :var d = 20;
Ale w
second
funkcji pokazuje ten sam błąd co poprzednio, ale ze zmiennąd
:Nie można znaleźć zmiennej:
d
Przykład:
function first() {
let a = b = c = 10;
var d = 20;
second();
}
function second() {
console.log(b + ", " + c); //shows "10, 10"
try{ console.log(a); } // Rreference error
catch(e){ console.error(e.message) }
try{ console.log(d); } // Reference error
catch(e){ console.error(e.message) }
}
first()
javascript
variable-declaration
beczenie interteiment
źródło
źródło
b
ic
nie są poprzedzone zevar
słów kluczowych.a
id
są lokalnifirst
.Dim Apple, Banana, Pear As Fruit
oznaczaDim Apple / Dim Banana / Dim Pear As Fruit
, a nieDim Apple As Fruit / ...
.Odpowiedzi:
To dlatego, że tak naprawdę mówisz:
I nie to, co myślisz, co mówisz:
Zauważysz, że bez względu na to, ile zmiennych dodasz do łańcucha, to tylko pierwsza (a) spowoduje błąd.
Wynika to z faktu, że „pozwól” zakresuje zmienną do bloku (lub „lokalnie”, co mniej więcej oznacza „w nawiasach”), w którym ją deklarujesz.
Jeśli zadeklarujesz zmienną bez „let”, będzie ona mierzyć zasięg globalnie.
Tak więc w funkcji, w której ustawiasz zmienne, wszystko otrzymuje wartość 10 (możesz to zobaczyć w debuggerze, jeśli umieścisz punkt przerwania). Jeśli w pierwszej funkcji umieścisz dziennik konsoli dla a, b, c, wszystko będzie dobrze.
Ale jak tylko opuścisz tę funkcję, pierwsza (a) - i znowu, pamiętaj, technicznie w kolejności przypisania, jest to ostatnia - „znika” (znowu, możesz to zobaczyć w debugger, jeśli ustawisz punkt przerwania w drugiej funkcji), ale pozostałe dwa (lub dowolna ich liczba) są nadal dostępne.
Wynika to z tego, że „pozwól” dotyczy TYLKO (więc tylko lokalnie zakresów) PIERWSZEJ ZMIENNEJ - znowu, która jest technicznie ostatnią zadeklarowaną i przypisaną wartością - w łańcuchu. Reszta technicznie nie ma „przed sobą”. Więc są one technicznie deklarowane globalnie (to znaczy na obiekcie globalnym), dlatego pojawiają się w twojej drugiej funkcji.
Spróbuj: usuń słowo kluczowe „let”. Wszystkie twoje zmienne będą teraz dostępne.
„var” ma podobny efekt lokalny, ale różni się sposobem, w jaki zmienna jest „podnoszona”, co zdecydowanie powinieneś zrozumieć, ale które nie jest bezpośrednio związane z twoim pytaniem.
(BTW, to pytanie zaskoczyłoby wystarczająco wielu profesjonalnych programistów JS, aby było dobre).
Zdecydowanie sugeruj spędzanie czasu z różnicami w sposobie deklarowania zmiennych w JS: bez słowa kluczowego, z „let” i „var”.
źródło
var
sięlet
w kontekście tej odpowiedzi? Nie rozumiem.var
może być podatny na błędy, jeśli jest używany niedbale. Sprawdź to skrzypcevar
ma jakąkolwiek przewagęlet
? Pozwól, że wyjaśnię: nowoczesny kontekst, w którym obie opcje są opcjami, i proszę o kod, który należy napisać. Kiedy już o to pytałem, otrzymałem odpowiedzi na temat „możesz ponownie zadeklarować zmienną za pomocąvar
”, w którym to przypadku muszę przypomnieć ludziom, że nie powinieneś ponownie deklarować zmiennych . Jest to albo błąd, albo błąd w logice kodu - więc zaletą ponownej deklaracji jest ... to, że pozwala ona napisać wadliwy kod. Mam jeszcze zobaczyć żadnego sensownego powodu, z przedzieraniavar
kiedylet
jest również opcja.W funkcji
first()
zmienneb
ic
są tworzone w locie, bez użyciavar
lublet
.Jest inny niż
Stają się domyślnie globalne. Dlatego są dostępne w
second()
Z dokumentacji
Aby tego uniknąć, możesz użyć
"use strict"
, który zapewni błędy, gdy użyjesz niezadeklarowanej zmiennejźródło
let a = 10, b = 10, c = 10;
lublet a, b, c; a = b = c = 10;
inaczej byłby prawidłowy sposób deklarowania zmiennych.b
nie zostanie oceniona / osiągnięta, błąd wystąpi w liniilet a = b = c = 10;
, czytany od prawej do lewej .c
jako pierwsza zmienna powodującaReferenceError
, że pozostała część wiersza nie zostanie wykonana (skrypt został zatrzymany)let a = 10, b = a, c = b;
jest również ważnePrzed nazwaniem rzeczy dziwnymi, najpierw zapoznaj się z podstawami:
Zmienne var i let są używane do deklaracji zmiennych w JavaScript. Na przykład,
Zmienne można również deklarować bez użycia
var
lublet
. Na przykład,Teraz różnica między powyższych rozwiązań jest to, że:
var
ma zakres funkcjii
let
ma zakres blokowy.Teraz zgodnie z tymi pojęciami spójrzmy na dany kod:
źródło
var
słowa kluczowego staje się globalny bez względu na to, gdzie jest zadeklarowany”, powinien być albo „zasięg ... staje się”, albo „ zakresy ... stają się " . Używanie cudzych słów wymaga cytowania, czy to stąd, czy gdzie indziej. meta.stackexchange.com/q/160071/211183Zmienne używające
let
słowa kluczowego powinny być dostępne tylko w zakresie bloku i niedostępne w funkcji zewnętrznej ...Każda zmienna, którą deklarujesz w ten sposób, nie używa
let
lubvar
. W deklaracji zmiennych brakuje przecinka.Nie zaleca się deklarowania zmiennej bez
var
słowa kluczowego. Może przypadkowo zastąpić istniejącą zmienną globalną. Zakres zmiennych zadeklarowanych bezvar
słowa kluczowego staje się globalny bez względu na to, gdzie jest zadeklarowany. Do zmiennych globalnych można uzyskać dostęp z dowolnego miejsca na stronie internetowej.źródło
Wynika to z tego, że kiedy nie używasz
let
lubvar
zmienna jest deklarowana w locie, lepiej zadeklaruj następującą.źródło
Dziwny problem jest spowodowany przez reguły zakresu w JavaScript
Zakładając, że chcesz zadeklarować 3 zmienne lokalne zainicjowane na tę samą wartość (100). Twój pierwszy () będzie wyglądał jak poniżej. W takim przypadku second () nie będzie miał dostępu do żadnej ze zmiennych, ponieważ są one lokalne dla first ()
Jeśli jednak chcesz zmiennych globalnych, twoja pierwsza () będzie wyglądać jak poniżej. W takim przypadku drugi będzie miał dostęp do wszystkich zmiennych, ponieważ mają one zasięg globalny
Zmienne lokalne (inaczej. Dostępne w bloku kodu, w którym są zadeklarowane).
Blok kodu to dowolny {} z wierszami kodu między.
Zmienne globalne (dostępne również w zakresie globalnym).
Te zmienne są dołączone do obiektu globalnego. Obiekt globalny jest zależny od środowiska. Jest to obiekt okna w przeglądarkach.
Uwaga specjalna: Możesz zadeklarować zmienne w JavaScript bez użycia słów kluczowych var, let, const. Zmienna zadeklarowana w ten sposób jest dołączona do obiektu globalnego, a zatem dostępna w zasięgu globalnym.
a = 100 // is valid and is in global scope
Niektóre artykuły do dalszego czytania: https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/ https://scotch.io/tutorials/understanding-scope-in-javascript https: //www.digitalocean .com / community / tutorials / zrozumienia-zmiennych-zakres-podnoszenie-w-javascript
źródło
Główną różnicą są zasady określania zakresu. Zmienne zadeklarowane przez słowo kluczowe var są kierowane do bezpośredniego ciała funkcji (stąd zakres funkcji), podczas gdy zmienne są kierowane do bezpośredniego otaczającego bloku oznaczonego przez {} (stąd zakres bloku). A kiedy mówisz
c i b mają żywotność tak, jak zabawa, ale tylko mają okres blokowania, a jeśli spróbujesz uzyskać dostęp przez odwołanie, zawsze pokaż błąd, ale c i b są globalnie, więc nie. Zauważysz to bez względu na to, ile zmiennych, które dodasz do łańcucha, będzie to tylko pierwsza (a), która powoduje błąd. Jest tak, ponieważ „pozwól” zakresuje zmienną do bloku (lub „lokalnie”, mniej więcej w znaczeniu „w nawiasach”) jeśli deklarujesz zmienną bez „let”, to mierzy ona zmienną globalnie, więc w funkcji, w której ustawiasz zmienne, wszystko otrzymuje wartość 10 (możesz to zobaczyć w debuggerze, jeśli umieścisz punkt przerwania). Jeśli w pierwszej funkcji umieścisz dziennik konsoli dla a, b, c, wszystko będzie dobrze. Ale jak tylko opuścisz tę funkcję, pierwsza (a) - i znowu, pamiętaj,
źródło
Oto 3 interesujące aspekty deklaracji zmiennych w JavaScript:
var ogranicza zakres zmiennej do bloku, w którym jest zdefiniowany. ( „var” dotyczy zakresu lokalnego ).
let umożliwia czasowe nadpisywanie wartości zewnętrznego zmiennej wewnątrz bloku.
Po prostu zadeklarowanie zmiennej bez zmiennej var lub let spowoduje, że zmienna będzie globalna, bez względu na to, gdzie zostanie zadeklarowana.
Oto demo let , która jest najnowszym dodatkiem do języka:
Wynik:
Wyjaśnienie:
Zmienne a i b zostały zapisane w „ first () ”, bez słów kluczowych var i let.
Dlatego i b są globalne, a co za tym idzie, są dostępne w całym programie.
W funkcji o nazwie „drugi” instrukcja „let a = 5” tymczasowo ustawia wartość „ a ” na „ 5 ”, tylko w zakresie funkcji.
Poza zakresem „ second () ”, IE, w zasięgu globalnym wartość „ a ” będzie taka, jak zdefiniowano wcześniej.
źródło