»Obseg« se nanaša na trenutni kontekst izvajanja, v katerem se lahko vaša koda sklicuje ali »vidi« vrednosti in izraze. Spremenljivke, objekti in funkcije iz različnih delov kode so dostopni na podlagi njihovih obsegov.

V JavaScriptu imajo lahko spremenljivke, objekti in funkcije globalni obseg, obseg modula, obseg bloka ali obseg funkcije.

Globalni obseg v JavaScriptu

Vsaka vrednost, deklarirana zunaj funkcije ali bloka v skriptu, ima globalni obseg in katera koli druga skriptna datoteka v vašem programu lahko dostopa do nje.

Na primer, deklaracija globalne spremenljivke v eni datoteki:

// index.js
naj globalVariable = "neko vrednost"

Pomeni, da lahko kateri koli drug skript v vašem programu dostopa do njega:

// otherScript.js
konzola.log (globalna spremenljivka) // neka vrednost

Deklaracija spremenljivk JavaScript v globalnem obsegu je slaba praksa, ker lahko povzroči onesnaženje imenskega prostora. Globalni imenski prostor je zgornji prostor Javascripta, ki vsebuje spremenljivke, objekte in funkcije. V brskalniku se pripne na Okno medtem ko NodeJS uporablja objekt z imenom globalno.

Onesnaževanje globalnega imenskega prostora lahko povzroči kolizijo imen. To je situacija, v kateri vaša koda poskuša uporabiti isto ime spremenljivke za različne stvari v istem imenskem prostoru. Pri velikih projektih, ki uporabljajo več knjižnic tretjih oseb, pogosto naletimo na trke imen.

Obseg modula

Modul je samostojna datoteka, ki enkapsulira in izvozi dele kode za uporabo drugih modulov v projektu. Omogoča vam učinkovitejšo organizacijo in vzdrževanje vaše kodne baze.

Formalizirani moduli ES vzorec modula JavaScript v JavaScriptu leta 2015.

Spremenljivke, ki jih deklarirate v modulu, so omejene na ta modul, kar pomeni, da noben drug del programa ne more dostopati do njih.

Spremenljivko, deklarirano v modulu, lahko uporabite le zunaj njega, če modul izvozi to spremenljivko z uporabo izvoz ključna beseda. To ime lahko nato uvozite v drug modul z uporabo uvoz ključna beseda.

Tukaj je primer, ki prikazuje izvoz razreda:

// index.js
izvozrazredFoo{
konstruktor(lastnost_1, lastnost_2) {
to.lastnost_1 = lastnost_1
to.lastnost_2 = lastnost_2
}
}

Tukaj je opisano, kako lahko uvozite ta modul in uporabite lastnost, ki jo izvozi:

// someModule.js
uvoz {Foo} od './index.js'

vrstica const = novo Foo('foo', 'bar')

konzola.log (bar.property_1) // foo

Datoteke v JavaScriptu niso privzeto deklarirane kot moduli.

V JavaScriptu na strani odjemalca lahko skript deklarirate kot modul tako, da nastavite vrsta pripisati modul na scenarij oznaka:

<vrsta skripta="modul" src="index.js"></script>

V NodeJS lahko skript deklarirate kot modul tako, da nastavite vrsta premoženje do modul v tvojem package.json mapa:

{
"vrsta": "modul"
}

Obseg bloka

Blok v JavaScriptu je kraj, kjer se začne in konča par zavitih oklepajev.

Spremenljivke, deklarirane znotraj bloka z pustiti, in konst ključne besede so omejene na ta blok, kar pomeni, da do njih ne morete dostopati zunaj njega. Ta obseg ne velja za spremenljivke, deklarirane z uporabo var ključna beseda:

{ // Začetek bloka
const one = '1'
naj dva = '2'
var tri = '3'
} // Konec bloka

konzola.log (eno) // vrže napako

konzola.log (tri) // "3"

Spremenljivke, zaprte v zgornjem bloku in deklarirane kot const ali let, so dostopne samo znotraj bloka. Vendar pa lahko dostopate do spremenljivke, deklarirane z uporabo var ključna beseda zunaj bloka.

Obseg funkcije

Spremenljivke, deklarirane znotraj funkcije, se običajno imenujejo lokalne spremenljivke in so omejene na funkcijo. Do njih ne morete dostopati zunaj funkcije. Ta obseg velja za spremenljivke, deklarirane z var, pustiti, in konst ključne besede.

Ker so spremenljivke, deklarirane v funkciji, lokalne za funkcijo, je mogoče imena spremenljivk ponovno uporabiti. Ponovna uporaba imen spremenljivk v obsegu funkcije je znana kot senčenje spremenljivk, zunanja spremenljivka pa naj bi bila "senčena".

Na primer:

funkcijopomnožiti() {
pustiti ena = 1
var dva = 2
konst tri = 3

vrnitev ena * dva * tri
}

// Spremenljivo senčenje
konst tri = 'tri' // Ne vrže napake

Razumevanje pravil za določanje obsega je bistvenega pomena

Z razumevanjem razpoložljivih obsegov v JavaScriptu se boste lažje izognili napakam. Poskus dostopa do spremenljivke, ki ni na voljo v določenem obsegu, je zrel vir napak.

Razumevanje obsega vključuje tudi koncepte, kot je globalno onesnaženje imenskega prostora, zaradi česar je lahko vaša koda bolj nagnjena k napakam.