Čitatelia ako vy pomáhajú podporovať MUO. Keď uskutočníte nákup pomocou odkazov na našej stránke, môžeme získať pridruženú províziu.

Zdvíhanie je mechanizmus JavaScriptu, ktorý vám umožňuje prístup k premenným a funkciám pred ich inicializáciou. Vyzdvihnutie takéhoto vyhlásenia ho efektívne posunie na vrchol jeho pôsobnosti.

Zistite všetko o tom, ako funguje zdvíhanie v JavaScripte a ako ho najlepšie spravovať, aby ste sa vyhli chybám v kóde.

Zdvíhacie premenné S var, let a konšt

Zdvíhanie je možné, pretože JavaScript používa kompilačný systém JIT (Just-in-Time), ktorý skenuje váš kód, aby identifikoval všetky premenné v ich príslušných rozsahoch.

Kompilátor JIT potom pri kompilácii zdvihne všetky inštancie deklarácií premenných na vrchol ich rozsahu. JavaScript zdvíha iba deklarácie premenných, nie ich inicializácie.

Správanie premenných pri zdvihnutí závisí od kľúčového slova, ktorým ich deklarujete, pretože každé kľúčové slovo sa správa inak.

var

Prístup k neinicializovanej premennej deklarovanej pomocou var kľúčové slovo sa vráti nedefinované. Napríklad:

instagram viewer
konzoly.log (foo); // nedefinované
var foo = 2;

Vyššie uvedené protokoly kódu nedefinované pretože to volá konzola.log pred inicializáciou premennej.

Kompilátor JavaScriptu zobrazuje predchádzajúci blok kódu takto:

var foo;
konzoly.log (foo); // nedefinované
foo = 2;

Počas zdvíhania sa premenné riadia pravidlá určovania rozsahu JavaScriptu. Javascript zdvihne premennú iba na vrchol rozsahu, v ktorom ste ju deklarovali. Pokus o protokolovanie hodnoty premennej mimo jej deklarovaného rozsahu bude mať za následok a ReferenceError. Ak napríklad deklarujete premennú vo funkcii, nebude viditeľná mimo tohto rozsahu:

funkciumyFunction() {
konzoly.log (foo); // nedefinované
var foo = 10;
}

myFunction();
konzoly.log (foo); // ReferenceError: foo nie je definované

Pokus o prístup k premennej mimo jej rozsahu bude mať za následok a ReferenceError.

nech a konšt

Podľa MDN dokumentáciu na nech a konšt zdvíhanie, JavaScript tiež zdvíha premenné deklarované pomocou nech a konšt Kľúčové slová. Avšak na rozdiel od premenných deklarovaných s var kľúčové slovo, nie sú inicializované s nedefinované hodnotu.

Napríklad:

funkciumyFunction() {
konzoly.log (foo); // nedefinované
konzoly.log (bar); // ReferenceError: Pred inicializáciou nie je možné získať prístup k „baru“.
konzoly.log (baz); // ReferenceError: Nemožno získať prístup k 'baz' pred inicializáciou

var foo = 5;
nech bar = 10;
konšt baz = 15;
}

myFunction();

Nemôžete pristupovať k premenným deklarovaným kľúčovými slovami let a const pred ich inicializáciou s hodnotou.

Zdvíhacie funkcie

JavaScript výťahy fungujú podobne ako premenné. Rovnako ako pri premenných to závisí od toho, ako ich deklarujete. Napríklad JavaScript zdvíha deklarácie funkcií odlišne od funkčných výrazov.

Deklarácia funkcie je funkcia deklarovaná s názvom, zatiaľ čo výraz funkcie je funkcia, ktorej názov môžete vynechať. Napríklad:

funkciufoo() {
// deklarácia funkcie
}

konšt pruh = () => {
// výraz funkcie
}

JavaScript zdvíha deklarácie funkcií, ale nie výrazy funkcií. Napríklad:

foo(); // 5
bar(); // TypeError: bar() nie je funkcia

// Deklarácia funkcie
funkciufoo() {
konzoly.log(5);
}

// Výraz funkcie
var bar = funkciuvýraz() {
konzoly.log(10);
};

Tento kód volá foo pred deklarovaním a inicializáciou ako funkcie, ale stále sa prihlasuje 5 do konzoly. Skús však zavolať bar má za následok a TypeError.

Riadenie zdvíhania

Uvedomenie si zdvíhania a možných chýb, ktoré by sa mohli vyskytnúť pri nesprávnom riadení, vám môže ušetriť dlhé hodiny ladenia. Tu je niekoľko spôsobov, ako môžete riadiť zdvíhanie.

Deklarujte premenné vo vnútri funkcií

Deklarujte premenné vo funkciách, ktoré k nim budú pristupovať. Nie vždy to budete môcť urobiť, pretože možno budete potrebovať globálnu premennú, ku ktorej máte prístup v rámci viacerých funkcií. Uistite sa teda, že globálne deklarujete premenné iba vtedy, ak to naozaj potrebujete.

Deklarujte premenné s let alebo const

Vždy by ste mali používať let a const kľúčové slová namiesto var kľúčové slovo pri deklarovaní premenných. Táto prax je výhodná pri deklarovaní lokálnych premenných vo funkcii. Poznať správne spôsoby deklarovať premenné v JavaScripte znižuje pravdepodobnosť chýb spôsobených zdvíhaním, ktoré sa vyskytujú vo vašom kóde.

Deklarujte premenné na vrchole ich rozsahu

Deklarujte všetky svoje premenné v hornej časti ich príslušných rozsahov pred akýmikoľvek inými príkazmi. Tým sa zabezpečí, že kompilátor JavaScriptu nebude musieť tieto premenné zdvíhať, aby k nim mal prístup.

Použitie prísneho režimu

Prísny režim je režim JavaScript ktorý reguluje zlú syntax, optimalizuje čas spustenia vášho kódu a zakazuje zneužívanie voľne napísanej syntaxe JavaScriptu vyvolávaním chýb v čase kompilácie.

Napríklad v „nedbalom režime“ v dôsledku zdvíhania môžete pristupovať k premennej mimo inicializovanej funkcie, aj keď nebola deklarovaná:

myFunction();
konzoly.log (foo); // 20

funkciumyFunction() {
foo = 20;
}

V bloku kódu vyššie JavaScript automaticky deklaruje foo a zdvihne ho na vrchol globálneho rozsahu, pričom ignoruje rozsah, v ktorom ste ho inicializovali.

Na opravu tohto správania môžete použiť prísny režim a ak sa pokúsite o prístup k premennej mimo rozsahu jej funkcie, vyvoláte chybu.

Striktný režim neprestáva zdvíhať úplne. Namiesto toho zabraňuje najviac mätúcim a chybám náchylným formám zdvíhania. Stále je dôležité porozumieť všeobecnému konceptu a pravidlám zdvíhania, aj keď používate bezpečnostnú sieť prísneho režimu.

Ak sa chcete prihlásiť do prísneho režimu na globálnej úrovni, deklarujte syntax v hornej časti súboru skriptu:

"použitieprísny"; // alebo 'použitieprísny'

Ak sa chcete prihlásiť do prísneho režimu na úrovni funkcie, deklarujte syntax v hornej časti tela funkcie pred akýmikoľvek príkazmi:

funkciumyStrictFunction() {
"použitieprísny";
}

Ak deklarujete prísny režim na úrovni funkcie, nastavenie sa bude vzťahovať iba na príkazy v rámci tejto funkcie.

Vyhlásenie prísneho režimu na globálnej úrovni zabraňuje prístupu k premenným mimo ich príslušných rozsahov:

"použitieprísny";
myFunction();
konzoly.log (foo); // ReferenceError: foo nie je definované

funkciumyFunction() {
foo = 20;
}

Keď je zapnutý prísny režim, kompilátor JavaScriptu sa zdvihne myFunction() na vrchol svojho rozsahu bez nedeklarovanej premennej.

Pochopte, čo ovplyvňuje zdvíhanie

Zdvíhanie je úplne jedinečné pre JavaScript a môže byť veľmi mätúce správanie, aby ste si omotali hlavu. Môže to ovplyvniť premenné a funkcie, ale existujú spôsoby, ako tomu zabrániť, ak to potrebujete.

Zdvíhanie môže ovplyvniť niekoľko faktorov, preto je najlepšie vyhnúť sa akémukoľvek výskytu premenných alebo funkčných zdvíhaní vo vašom kóde.