Funktion laajuus ja lohkon laajuus
Kun ilmoitat muuttujan funktion sisällä, muuttuja on sidottu funktioon, etkä pääse siihen käsiksi funktion ulkopuolella. var
on avainsana, jolla voit määritellä muuttujan funktio-laajuuden käytettäväksi.
Nyt saatat kysyä, että jos se antaa virheen, vaikka käyttäisit let
tai const
, miksi vain var
liittyy funktio-laajuuteen? Asia on niin, että let
ja const
käytetään määrittelemään lohkon laajuus, ja ennen ES6:sta JavaScriptissä ei ollut lohkon laajuutta tai let
ja const
.
Lohkon laajuus on
if
,switch
ehtojen taifor
jawhile
silmukoiden sisällä oleva alue. Yksinkertaisesti sanottuna , aina kun näet {sakaraiset sulut}, se on lohko.
Katsotaanpa esimerkki:
Nyt saatat olettaa, että yksikään lokikomennoista ei toimisi, mutta kuten näet, näin ei ole, sillä var:lla määritellyt muuttujat if
-, switch
-ehtojen tai for
– ja while
-silmukoiden sisällä olevat muuttujat ovat globaalisti käytettävissä ja kuuluvat globaaliin vaikutusalueeseen, ja siksi on parempi käytäntö käyttää niiden kanssa let
– ja const
-merkkejä.
Leksikaalinen laajuus
Viimein olemme päässeet tämän viestin todelliseen tarkoitukseen. No, olisin voinut ohittaa pitkän keskustelun laajuudesta, mutta henkilökohtaisesti en usko, että voit ymmärtää leksikaalista laajuutta tuntematta sen ympärillä pyöriviä keskeisiä osatekijöitä.
Jälleen yksi muistettava seikka:
Yksinkertaisesti sanottuna se tarkoittaa, että children scope pääsee käsiksi muuttujiin, jotka on määritelty parent scopeissa. Jos esimerkiksi määrittelen funktion ja ilmoitan muuttujan sen sisällä ja määrittelen saman funktion sisällä toisen funktion, minun pitäisi pystyä käyttämään kyseistä muuttujaa sisemmän funktion sisällä leksikaalisen skaalauksen vuoksi. Katsotaanpa esimerkki:
Esimerkistä nähdään, että outerFunction()
:ssa outerFunction()
julistettuihin muuttujiin päästään käsiksi innerfunction()
:n kautta, tämä on leksikaalista scopingia.
Muuttujien laajuus määräytyy muuttujien sijainnin perusteella koodissa. Ratkaistakseen muuttujia JavaScript aloittaa sisimmästä laajuudesta ja etsii ulospäin, kunnes se löytää etsimänsä muuttujan. Yllä olevassa esimerkissä Javascript etsii ensin muuttujaa innerFunction()
:n sisältä, ja kun se ei löydä sitä, se siirtyy sen ulkopuolelle eli outerFunction()
Leksikaalinen rajaus on parempi, koska voimme helposti selvittää muuttujan arvon koodista, kun taas dynaamisessa rajauksessa muuttujan merkitys voi muuttua ajon aikana, mikä tekee siitä monimutkaisen ymmärtää.
Ymmärsimme siis onnistuneesti, mitä leksikaalinen rajaus on, nyt tarkastellaan sulkuja, joissa leksikaalista rajausta todella käytetään.