Bralci, kot ste vi, pomagajo podpirati MUO. Ko opravite nakup prek povezav na našem spletnem mestu, lahko zaslužimo partnersko provizijo.
Dviganje je mehanizem JavaScript, ki vam omogoča dostop do spremenljivk in funkcij, preden jih inicializirate. Dvigovanje takšne deklaracije jo dejansko premakne na vrh njenega obsega.
Izvedite vse o tem, kako dvigovanje deluje v JavaScriptu in kako ga najbolje upravljati, da se izognete napakam v kodi.
Dvižne spremenljivke Z var, let in const
Dvigovanje je možno, ker JavaScript uporablja sistem prevajanja JIT (pravočasno), ki skenira vašo kodo, da identificira vse spremenljivke v njihovih ustreznih obsegih.
Prevajalnik JIT nato po prevajanju dvigne vse primerke deklaracij spremenljivk na vrh njihovega obsega. JavaScript dvigne samo deklaracije spremenljivk, ne pa tudi njihovih inicializacij.
Vedenje spremenljivk, ko so dvignjene, je odvisno od ključne besede, s katero jih deklarirate, saj se vsaka ključna beseda obnaša drugače.
var
Dostop do neinicializirane spremenljivke, deklarirane z var ključna beseda se bo vrnila nedoločeno. Na primer:
konzola.log (foo); // nedoločeno
var foo = 2;
Zgornja koda se beleži nedoločeno ker kliče console.log preden inicializira spremenljivko.
Prevajalnik JavaScript si prejšnji blok kode ogleda takole:
var foo;
konzola.log (foo); // nedoločeno
foo = 2;
Med dvigovanjem spremenljivke upoštevajo pravila obsega JavaScript. Javascript bo samo dvignil spremenljivko na vrh obsega, v katerem ste jo deklarirali. Poskus beleženja vrednosti spremenljivke zunaj njenega deklariranega obsega bo povzročil a ReferenceError. Na primer, če deklarirate spremenljivko znotraj funkcije, ne bo vidna zunaj tega obsega:
funkcijomojaFunkcija() {
konzola.log (foo); // nedoločeno
var foo = 10;
}
mojaFunkcija();
konzola.log (foo); // ReferenceError: foo ni definiran
Poskus dostopa do spremenljivke zunaj njenega obsega bo povzročil a ReferenceError.
pusti in konst
Glede na MDN dokumentacijo o pustiti in konst dviganje, JavaScript dvigne tudi spremenljivke, deklarirane z pustiti in konst ključne besede. Vendar pa za razliko od spremenljivk, deklariranih z var ključno besedo, niso inicializirani z an nedoločeno vrednost.
Na primer:
funkcijomojaFunkcija() {
konzola.log (foo); // nedoločeno
konzola.log (bar); // ReferenceError: ni mogoče dostopati do vrstice pred inicializacijo
konzola.log (baz); // ReferenceError: ni mogoče dostopati do 'baz' pred inicializacijovar foo = 5;
pustiti bar = 10;
konst baz = 15;
}
mojaFunkcija();
Ne morete dostopati do spremenljivk, deklariranih s ključnima besedama let in const, preden jih inicializirate z vrednostjo.
Dvižne funkcije
JavaScript hoists deluje podobno kot spremenljivke. Tako kot pri spremenljivkah je odvisno od tega, kako jih deklarirate. Na primer, JavaScript deklaracije funkcij dvigne drugače kot funkcijske izraze.
Deklaracija funkcije je funkcija, deklarirana z imenom, medtem ko je izraz funkcije funkcija, katere ime lahko izpustite. Na primer:
funkcijofoo() {
// deklaracija funkcije
}
konst bar = () => {
// izraz funkcije
}
JavaScript dvigne deklaracije funkcij, ne pa tudi funkcijskih izrazov. Na primer:
foo(); // 5
bar(); // TypeError: bar() ni funkcija// Deklaracija funkcije
funkcijofoo() {
konzola.log(5);
}
// Izraz funkcije
var bar = funkcijoizražanje() {
konzola.log(10);
};
Ta koda kliče foo preden jo deklarirate in inicializirate kot funkcijo, vendar se še vedno beleži 5 na konzolo. Vendar poskušam poklicati bar povzroči a TypeError.
Upravljanje dviganja
Če se zavedate dvigovanja in morebitnih napak, do katerih bi lahko prišlo ob napačnem upravljanju, vam lahko prihranijo dolge ure odpravljanja napak. Tukaj je nekaj načinov, kako lahko upravljate dviganje.
Deklarirajte spremenljivke znotraj funkcij
Deklarirajte spremenljivke znotraj funkcij, ki bodo dostopale do njih. Tega ne boste mogli vedno narediti, saj boste morda potrebovali globalno spremenljivko, do katere lahko dostopate znotraj več funkcij. Zato zagotovite, da spremenljivke deklarirate globalno samo, če to res potrebujete.
Deklarirajte spremenljivke z let ali const
Vedno morate uporabiti let in const ključne besede namesto var ključna beseda pri deklaraciji spremenljivk. Ta praksa je koristna pri deklaraciji lokalnih spremenljivk znotraj funkcije. Poznavanje pravilnih načinov za deklariraj spremenljivke v JavaScriptu zmanjša možnosti za napake, ki jih povzroči dvigovanje v vaši kodi.
Deklarirajte spremenljivke na vrhu njihovega obsega
Vse svoje spremenljivke deklarirajte na vrhu njihovih ustreznih obsegov, pred vsemi drugimi izjavami. S tem boste zagotovili, da prevajalniku JavaScript ne bo treba dvigniti teh spremenljivk za dostop do njih.
Uporaba strogega načina
Strogi način je način JavaScript ki ureja slabo sintakso, optimizira čas izvajanja vaše kode in prepoveduje zlorabo ohlapno vtipkane sintakse JavaScripta z oddajanjem napak v času prevajanja.
Na primer, v »površnem načinu« lahko zaradi dvigovanja dostopate do spremenljivke zunaj inicializirane funkcije, čeprav ni bila deklarirana:
mojaFunkcija();
konzola.log (foo); // 20
funkcijomojaFunkcija() {
foo = 20;
}
V zgornjem bloku kode se JavaScript samodejno prijavi foo in ga dvigne na vrh globalnega obsega, pri čemer ignorira obseg, v katerem ste ga inicializirali.
S strogim načinom lahko popravite to vedenje in povzročite napako, če poskušate dostopati do spremenljivke zunaj obsega njene funkcije.
Strogi način ne ustavi dvigovanja v celoti. Namesto tega preprečuje najbolj zmedene in k napakam nagnjene oblike dvigovanja. Še vedno je pomembno razumeti splošen koncept in pravila za dviganje, tudi pri uporabi zaščitne mreže v strogem načinu.
Če se želite odločiti za strogi način na globalni ravni, deklarirajte sintakso na vrhu datoteke skripta:
"uporabastroga"; // ali 'uporabastroga'
Če se želite odločiti za strogi način na ravni funkcije, deklarirajte sintakso na vrhu telesa funkcije pred vsemi stavki:
funkcijomyStrictFunction() {
"uporabastroga";
}
Če deklarirate strogi način na ravni funkcije, bo nastavitev veljala samo za stavke znotraj te funkcije.
Deklaracija strogega načina na globalni ravni preprečuje dostop do spremenljivk izven njihovega obsega:
"uporabastroga";
mojaFunkcija();
konzola.log (foo); // ReferenceError: foo ni definiran
funkcijomojaFunkcija() {
foo = 20;
}
Ko je vklopljen strogi način, se bo prevajalnik JavaScript dvignil mojaFunkcija() na vrh svojega obsega brez neprijavljene spremenljivke.
Razumeti, kaj vpliva na dviganje
Dvigovanje je precej edinstveno za JavaScript in je lahko zelo zmedeno vedenje, da se obrnete na glavo. Lahko vpliva na spremenljivke in funkcije, vendar obstajajo načini, kako to preprečiti, če je potrebno.
Na dviganje lahko vpliva več dejavnikov, zato je najbolje, da se v vaši kodi izognete pojavu dvigovanja spremenljivke ali funkcije.