Lezers zoals jij steunen MUO. Wanneer u een aankoop doet via links op onze site, kunnen we een aangesloten commissie verdienen.
Hoisting is een JavaScript-mechanisme waarmee u toegang krijgt tot variabelen en functies voordat u ze initialiseert. Door een dergelijke verklaring op te hijsen, wordt deze in feite naar de top van zijn reikwijdte verplaatst.
Leer alles over hoe hijsen werkt in JavaScript en hoe je dit het beste kunt beheren om fouten in je code te voorkomen.
Hijsvariabelen Met var, let en const
Hijsen is mogelijk omdat JavaScript het JIT-compilatiesysteem (Just-in-Time) gebruikt, dat uw code scant om alle variabelen in hun respectievelijke bereik te identificeren.
De JIT-compiler tilt vervolgens alle instanties van variabeledeclaraties naar de top van hun bereik bij compilatie. JavaScript tilt alleen declaraties van variabelen op, niet hun initialisaties.
Het gedrag van variabelen, wanneer ze worden gehesen, hangt af van het trefwoord waarmee u ze declareert, aangezien elk trefwoord zich anders gedraagt.
var
Toegang krijgen tot een niet-geïnitialiseerde variabele die is gedeclareerd met de var trefwoord zal terugkeren ongedefinieerd. Bijvoorbeeld:
troosten.log (foo); // niet gedefinieerd
var foo = 2;
De bovenstaande code logt ongedefinieerd omdat het roept console.log voordat het de variabele initialiseert.
De JavaScript-compiler bekijkt het vorige codeblok als volgt:
var foe;
troosten.log (foo); // niet gedefinieerd
foo = 2;
Tijdens het hijsen gehoorzamen variabelen aan de regels voor JavaScript-scoping. Javascript zal een variabele alleen naar de top van het bereik hijsen waarin u deze hebt gedeclareerd. Pogingen om de waarde van een variabele buiten het gedeclareerde bereik te loggen, resulteren in een Referentiefout. Als u bijvoorbeeld een variabele binnen een functie declareert, is deze buiten dat bereik niet zichtbaar:
functiemijnFunctie() {
troosten.log (foo); // niet gedefinieerd
var foo = 10;
}
mijnFunctie();
troosten.log (foo); // ReferenceError: foo is niet gedefinieerd
Proberen toegang te krijgen tot een variabele buiten zijn bereik, zal resulteren in een Referentiefout.
laat en const
Volgens de MDN documentatie op laten En const hijsen, JavaScript tilt ook variabelen op die zijn gedeclareerd met de laten En const trefwoorden. In tegenstelling tot variabelen die zijn gedeclareerd met de var trefwoord, ze worden niet geïnitialiseerd met een ongedefinieerd waarde.
Bijvoorbeeld:
functiemijnFunctie() {
troosten.log (foo); // niet gedefinieerd
troosten.log (balk); // ReferenceError: Geen toegang tot 'bar' vóór initialisatie
troosten.log (baz); // ReferenceError: Geen toegang tot 'baz' vóór initialisatievar foo = 5;
laten balk = 10;
const baz = 15;
}
mijnFunctie();
U hebt geen toegang tot variabelen die zijn gedeclareerd met de trefwoorden let en const voordat u ze met een waarde hebt geïnitialiseerd.
Hijsfuncties
JavaScript-liften werken op dezelfde manier als variabelen. Net als bij variabelen hangt het ervan af hoe u ze declareert. JavaScript heft bijvoorbeeld functiedeclaraties anders op dan functie-expressies.
Een functiedeclaratie is een functie die wordt gedeclareerd met een naam, terwijl een functie-expressie een functie is waarvan u de naam kunt weglaten. Bijvoorbeeld:
functiefoe() {
// functie declaratie
}
const balk = () => {
// functie-expressie
}
JavaScript neemt functiedeclaraties op, maar geen functie-expressies. Bijvoorbeeld:
foo(); // 5
bar(); // TypeError: bar() is geen functie// Functieverklaring
functiefoe() {
troosten.log(5);
}
// Functie-uitdrukking
var balk = functieuitdrukking() {
troosten.log(10);
};
Deze code belt foe voordat het als een functie wordt gedeclareerd en geïnitialiseerd, maar het logt nog steeds 5 naar de console. Toch proberen te bellen bar resulteert in een Typefout.
Beheren van hijsen
Als u zich bewust bent van hijsen en de mogelijke fouten die kunnen optreden als het verkeerd wordt beheerd, kunt u vele uren debuggen besparen. Hier zijn enkele manieren waarop u het hijsen kunt beheren.
Declareer variabelen binnen functies
Declareer variabelen binnen de functies die er toegang toe hebben. U zult dit niet altijd kunnen doen, omdat u mogelijk een globale variabele nodig heeft waartoe u binnen meerdere functies toegang hebt. Zorg er dus voor dat u alleen variabelen globaal declareert als dat echt nodig is.
Variabelen declareren Met let of const
Je moet altijd de l gebruikenet en Const trefwoorden in plaats van de var trefwoord bij het declareren van variabelen. Deze praktijk is handig bij het declareren van lokale variabelen binnen een functie. De juiste manieren kennen variabelen declareren in JavaScript verkleint de kans op fouten veroorzaakt door hijsen in uw code.
Declareer variabelen aan de top van hun bereik
Declareer al uw variabelen bovenaan hun respectievelijke bereik, vóór andere uitspraken. Als u dit doet, zorgt u ervoor dat de JavaScript-compiler die variabelen niet hoeft te hijsen om er toegang toe te krijgen.
Strikte modus gebruiken
Strikte modus is een JavaScript-modus dat reguleert slechte syntaxis, optimaliseert de runtime van uw code en verbiedt misbruik van de losjes getypte syntaxis van JavaScript door fouten te genereren tijdens het compileren.
In de "slordige modus" bijvoorbeeld, als gevolg van hijsen, hebt u toegang tot een variabele buiten de geïnitialiseerde functie, ook al is deze niet gedeclareerd:
mijnFunctie();
troosten.log (foo); // 20
functiemijnFunctie() {
foe = 20;
}
In het bovenstaande codeblok declareert JavaScript automatisch foe en hijst het naar de top van het globale bereik, waarbij het bereik waarin u het hebt geïnitialiseerd wordt genegeerd.
U kunt de strikte modus gebruiken om dit gedrag op te lossen en een fout te genereren als u toegang probeert te krijgen tot de variabele buiten het functiebereik.
Strikte modus stopt niet helemaal met hijsen. In plaats daarvan voorkomt het de meest verwarrende en foutgevoelige vormen van hijsen. Het is nog steeds belangrijk om het algemene concept en de regels achter het hijsen te begrijpen, zelfs wanneer u het vangnet voor strikte modus gebruikt.
Om op mondiaal niveau voor de strikte modus te kiezen, declareert u de syntaxis bovenaan uw scriptbestand:
"gebruikstreng"; // of 'gebruikstreng'
Als u op functieniveau wilt kiezen voor de strikte modus, declareert u de syntaxis bovenaan de hoofdtekst van een functie vóór eventuele instructies:
functiemijnStrictFunction() {
"gebruikstreng";
}
Als u de strikte modus declareert op functieniveau, is de instelling alleen van toepassing op instructies binnen die functie.
Door de strikte modus op globaal niveau te declareren, wordt voorkomen dat variabelen buiten hun respectieve bereik worden benaderd:
"gebruikstreng";
mijnFunctie();
troosten.log (foo); // ReferenceError: foo is niet gedefinieerd
functiemijnFunctie() {
foe = 20;
}
Als de strikte modus is ingeschakeld, zal de JavaScript-compiler hijsen mijnFunctie() naar de top van zijn bereik zonder de niet-gedeclareerde variabele.
Begrijp wat het hijsen beïnvloedt
Hijsen is vrij uniek voor JavaScript en kan erg verwarrend gedrag zijn om je hoofd omheen te wikkelen. Het kan invloed hebben op variabelen en functies, maar er zijn manieren om dit te voorkomen als dat nodig is.
Verschillende factoren kunnen het hijsen beïnvloeden, dus het is het beste om te voorkomen dat variabelen of functies in uw code voorkomen.