Funktionsomfång och blockomfång
När du deklarerar en variabel i en funktion är variabeln bunden i funktionen och du kan inte komma åt den utanför funktionen. var
är nyckelordet för att definiera en variabel för åtkomst till funktionsomfång.
Nu kanske du frågar dig, om det ger ett fel även om du använder let
eller const
, varför är bara var
förknippat med funktionsomfång? Saken är den att let
och const
används för att definiera blockomfång, och före ES6 hade JavaScript inte blockomfång eller let
och const
.
Ett blockomfång är området inom
if
,switch
villkor ellerfor
ochwhile
slingor. Enkelt uttryckt , när du ser {krökta parenteser} är det ett block.
Vi ska se ett exempel:
Nu kanske du förväntar dig att inget av loggkommandona ska fungera, men som du kan se är det inte fallet med var, variabler definierade med var inuti if
, switch
villkor eller for
och while
slingor kan nås globalt och är en del av den globala räckvidden, och därför är det bättre att använda let
och const
med dem.
Lexikalt tillämpningsområde
Slutligt har vi nått det verkliga syftet med det här inlägget. Nåväl, jag kunde ha hoppat över den långa diskussionen om räckvidd, men personligen tror jag inte att man kan förstå lexikal räckvidd utan att känna till de viktigaste komponenterna som kretsar kring den.
Ännu en punkt att komma ihåg: Javascript har lexikal scoping med funktioner scope.
Med enkla ord betyder det att barnscopet har tillgång till de variabler som är definierade i det överordnade scopet. Om jag till exempel definierar en funktion och deklarerar en variabel i den och i samma funktion definierar en annan funktion, bör jag kunna använda variabeln i den inre funktionen på grund av lexikal scoping. Låt oss se ett exempel:
Det framgår av exemplet att variablerna som deklareras i outerFunction()
nås av innerfunction()
, detta är lexikal scoping.
Variablers räckvidd definieras av deras position i koden. För att lösa variabler börjar JavaScript i det innersta scope och söker utåt tills det hittar variabeln som det letar efter. I exemplet ovan söker Javascript först efter variabler inom innerFunction()
och när det inte hittar den går det utanför, dvs. outerFunction()
Lexikal scoping är bättre eftersom vi enkelt kan räkna ut värdet på en variabel från koden, medan i dynamisk scoping kan betydelsen av en variabel ändras vid körning, vilket gör det komplicerat att förstå.
Så, vi har framgångsrikt förstått vad lexikal scoping är, låt oss nu titta på closures där lexikal scoping faktiskt används.