Function Scope en Block Scope
Wanneer u een variabele binnen een functie declareert, is de variabele binnen de functie gebonden en kunt u er buiten de functie niet bij. var
is het sleutelwoord om een variabele te definiëren voor functiebereik-toegankelijkheid.
Nu, zou je kunnen vragen, als het een fout geeft, zelfs als je let
of const
gebruikt, waarom is alleen var
geassocieerd met functiebereik? let
en const
worden gebruikt om blokbereik te definiëren, en vóór ES6 had JavaScript geen blokbereik of let
en const
.
Een blokbereik is het gebied binnen
if
,switch
voorwaarden offor
enwhile
lussen. Eenvoudig gezegd, wanneer u {krullende haakjes} ziet, is het een blok.
Laten we eens een voorbeeld bekijken:
Nu zou je verwachten dat geen van de log commando’s zou werken, maar zoals je kunt zien is dat niet het geval met var, variabelen gedefinieerd met var binnen if
, switch
condities of for
en while
loops kunnen globaal benaderd worden en maken deel uit van het globale bereik en daarom is het beter om let
en const
met hen te gebruiken.
Lexical Scope
Eindelijk hebben we het ware doel van deze post bereikt. Nou, ik had de lange discussie over scope kunnen overslaan, maar persoonlijk denk ik niet dat je lexical scope kunt begrijpen zonder de belangrijkste componenten te kennen die eromheen draaien.
Wederom een punt om te onthouden: Javascript heeft lexical scoping met functies scope.
In eenvoudige woorden, het betekent dat de kinderen scope toegang heeft tot de variabelen gedefinieerd in de ouder scope. Bijvoorbeeld, als ik een functie zou definiëren en een variabele daarin zou declareren en in dezelfde functie een andere functie zou definiëren, dan zou ik in staat moeten zijn om die variabele te gebruiken in de binnenste functie vanwege lexical scoping. Laten we een voorbeeld bekijken:
Uit het voorbeeld kunt u opmaken dat de variabelen die in outerFunction()
worden gedeclareerd, toegankelijk zijn via innerfunction()
, dit is lexical scoping.
De reikwijdte van variabelen wordt bepaald door hun positie in de code. Om variabelen op te lossen, begint JavaScript bij het binnenste bereik en zoekt naar buiten totdat het de variabele vindt waarnaar het op zoek was. In het bovenstaande voorbeeld zoekt Javascript eerst naar variabelen binnen innerFunction()
en wanneer het die niet vindt, gaat het naar buiten, d.w.z. outerFunction()
Lexical scoping is beter omdat we gemakkelijk de waarde van een variabele kunnen achterhalen vanuit de code, terwijl in dynamic scoping de betekenis van een variabele kan veranderen tijdens runtime, wat het complex maakt om te begrijpen.
Dus, we hebben met succes begrepen wat lexical scoping is, laten we nu eens kijken naar closures waar lexical scoping daadwerkelijk wordt gebruikt.