Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju.

Podizanje je JavaScript mehanizam koji vam omogućuje pristup varijablama i funkcijama prije nego što ih inicijalizirate. Podizanje takve deklaracije učinkovito je pomiče na vrh njezina opsega.

Saznajte sve o tome kako podizanje radi u JavaScriptu i kako njime najbolje upravljati da biste izbjegli pogreške u svom kodu.

Varijable za podizanje S var, let i const

Podizanje je moguće jer JavaScript koristi sustav kompilacije JIT (Just-in-Time), koji skenira vaš kod kako bi identificirao sve varijable u njihovim dometima.

JIT kompajler zatim podiže sve instance deklaracija varijabli na vrh njihova opsega nakon kompilacije. JavaScript podiže samo deklaracije varijabli, ne i njihove inicijalizacije.

Ponašanje varijabli, kada se podignu, ovisi o ključnoj riječi s kojom ih deklarirate, budući da se svaka ključna riječ ponaša drugačije.

var

Pristup neinicijaliziranoj varijabli deklariranoj s var ključna riječ će se vratiti nedefiniran. Na primjer:

instagram viewer
konzola.log (foo); // nedefiniran
var foo = 2;

Gore navedeni kod zapisuje zapise nedefiniran jer zove konzola.log prije nego inicijalizira varijablu.

JavaScript prevodilac prikazuje prethodni blok koda ovako:

var foo;
konzola.log (foo); // nedefiniran
foo = 2;

Tijekom podizanja, varijable se pridržavaju pravila JavaScript opsega. Javascript će podići varijablu samo na vrh opsega u kojem ste je deklarirali. Pokušaj bilježenja vrijednosti varijable izvan njenog deklariranog opsega rezultirat će a ReferenceError. Na primjer, ako deklarirate varijablu unutar funkcije, ona neće biti vidljiva izvan tog opsega:

funkcijamojaFunkcija() {
konzola.log (foo); // nedefiniran
var foo = 10;
}

mojaFunkcija();
konzola.log (foo); // ReferenceError: foo nije definiran

Pokušaj pristupa varijabli izvan njenog opsega rezultirat će a ReferenceError.

neka i konst

Prema MDN dokumentaciju o neka i konst dizanje, JavaScript također podiže varijable deklarirane s neka i konst ključne riječi. Međutim, za razliku od varijabli deklariranih s var ključna riječ, oni se ne inicijaliziraju s nedefiniran vrijednost.

Na primjer:

funkcijamojaFunkcija() {
konzola.log (foo); // nedefiniran
konzola.log (bar); // ReferenceError: Nije moguće pristupiti 'traci' prije inicijalizacije
konzola.log (baz); // ReferenceError: Nije moguće pristupiti 'baz' prije inicijalizacije

var foo = 5;
neka bar = 10;
konst baz = 15;
}

mojaFunkcija();

Ne možete pristupiti varijablama deklariranim ključnim riječima let i const prije nego što ih inicijalizirate vrijednošću.

Funkcije podizanja

JavaScript podiže funkcije slično varijablama. Kao i kod varijabli, ovisi o tome kako ih deklarirate. Na primjer, JavaScript podiže deklaracije funkcija drugačije od izraza funkcija.

Deklaracija funkcije je funkcija deklarirana imenom, dok je izraz funkcije funkcija čije ime možete izostaviti. Na primjer:

funkcijafuj() {
// deklaracija funkcije
}

konst traka = () => {
// izraz funkcije
}

JavaScript podiže deklaracije funkcija, ali ne i izraze funkcija. Na primjer:

foo(); // 5
bar(); // TypeError: bar() nije funkcija

// Deklaracija funkcije
funkcijafuj() {
konzola.log(5);
}

// Izraz funkcije
var bar = funkcijaizraz() {
konzola.log(10);
};

Ovaj kod poziva fuj prije deklariranja i inicijalizacije kao funkcije, ali se i dalje zapisuje 5 na konzolu. Međutim, pokušavajući nazvati bar rezultira a TypeError.

Upravljanje dizanjem

Biti svjestan podizanja i mogućih pogrešaka koje bi se mogle pojaviti ako se njima upravlja pogrešno može vam uštedjeti duge sate otklanjanja pogrešaka. Evo nekoliko načina na koje možete upravljati podizanjem.

Deklarirajte varijable unutar funkcija

Varijable deklarirajte unutar funkcija koje će im pristupiti. Nećete to uvijek moći učiniti jer će vam možda trebati globalna varijabla kojoj možete pristupiti unutar više funkcija. Dakle, osigurajte da deklarirate varijable globalno samo ako to stvarno trebate.

Deklarirajte varijable s let ili const

Uvijek biste trebali koristiti let i const ključne riječi umjesto var ključna riječ pri deklaraciji varijabli. Ova praksa je korisna kada se deklariraju lokalne varijable unutar funkcije. Poznavanje pravih načina za deklarirati varijable u JavaScriptu smanjuje mogućnost pogrešaka uzrokovanih podizanjem u vašem kodu.

Deklarirajte varijable na vrhu njihova opsega

Deklarirajte sve svoje varijable na vrhu njihovih dometa, prije bilo koje druge izjave. Time ćete osigurati da JavaScript prevoditelj ne mora podizati te varijable da bi im pristupio.

Korištenje strogog načina rada

Strogi način je JavaScript način koji regulira lošu sintaksu, optimizira vrijeme izvođenja vašeg koda i zabranjuje zlouporabu JavaScript-ove slabo upisane sintakse izbacivanjem pogrešaka tijekom kompajliranja.

Na primjer, u "neurednom načinu rada", zbog podizanja, možete pristupiti varijabli izvan inicijalizirane funkcije, iako nije deklarirana:

mojaFunkcija();
konzola.log (foo); // 20

funkcijamojaFunkcija() {
foo = 20;
}

U gornjem bloku koda JavaScript automatski deklarira fuj i podiže ga na vrh globalnog opsega, zanemarujući opseg u kojem ste ga inicijalizirali.

Možete koristiti strogi način da popravite ovo ponašanje i izbacite pogrešku ako pokušate pristupiti varijabli izvan njezinog opsega funkcije.

Strogi način rada ne prestaje u potpunosti dizati. Umjesto toga, sprječava najzbunjujuće oblike podizanja koji su najskloniji pogreškama. I dalje je važno razumjeti opći koncept i pravila koja stoje iza dizanja, čak i kada koristite zaštitnu mrežu strogog načina rada.

Da biste se uključili u strogi način rada na globalnoj razini, deklarirajte sintaksu na vrhu datoteke skripte:

"koristitistrog"; // ili 'koristitistrog'

Da biste se uključili u strogi način rada na razini funkcije, deklarirajte sintaksu na vrhu tijela funkcije prije bilo koje izjave:

funkcijamyStrictFunction() {
"koristitistrog";
}

Ako deklarirate strogi način rada na razini funkcije, postavka će se primijeniti samo na izjave unutar te funkcije.

Deklariranje strogog načina rada na globalnoj razini sprječava pristup varijablama izvan njihovih dotičnih opsega:

"koristitistrog";
mojaFunkcija();
konzola.log (foo); // ReferenceError: foo nije definiran

funkcijamojaFunkcija() {
foo = 20;
}

S uključenim strogim načinom rada, JavaScript prevodilac će se pokrenuti mojaFunkcija() na vrh svog opsega bez nedeklarisane varijable.

Saznajte što utječe na podizanje

Podizanje je prilično jedinstveno za JavaScript i može biti vrlo zbunjujuće ponašanje oko kojeg morate razmišljati. Može utjecati na varijable i funkcije, ali postoje načini da to spriječite ako je potrebno.

Nekoliko čimbenika može utjecati na podizanje, stoga je najbolje izbjegavati pojavu pokretanja varijabli ili funkcija u vašem kodu.