Teiesugused lugejad aitavad MUO-d toetada. Kui teete ostu meie saidil olevate linkide abil, võime teenida sidusettevõtte komisjonitasu.

Tõstmine on JavaScripti mehhanism, mis võimaldab teil pääseda juurde muutujatele ja funktsioonidele enne nende lähtestamist. Sellise deklaratsiooni tõstmine viib selle tõhusalt oma ulatuse tippu.

Lugege kõike selle kohta, kuidas tõstmine JavaScriptis töötab ja kuidas seda kõige paremini hallata, et vältida koodis vigu.

Tõstemuutujad Var, let ja const

Tõstmine on võimalik, kuna JavaScript kasutab JIT (Just-in-Time) kompileerimissüsteemi, mis skannib teie koodi, et tuvastada kõik muutujad nende vastavas ulatuses.

Seejärel tõstab JIT-i kompilaator kõik muutujate deklaratsioonide eksemplarid koostamisel nende ulatuse tippu. JavaScript tõstab ainult muutujate deklaratsioonid, mitte nende lähtestused.

Muutujate käitumine tõstmisel sõltub märksõnast, millega need deklareerite, kuna iga märksõna käitub erinevalt.

var

Juurdepääs initsialiseerimata muutujale, mis on deklareeritud käsuga var märksõna naaseb määratlemata. Näiteks:

konsool.log (foo); // määratlemata
var foo = 2;

Ülaltoodud kood logib määratlemata sest see kutsub console.log enne kui see muutuja initsialiseerib.

JavaScripti kompilaator vaatab eelmist koodiplokki järgmiselt:

var foo;
konsool.log (foo); // määratlemata
foo = 2;

Tõstmise ajal järgivad muutujad JavaScripti ulatuse reeglid. Javascript tõstab muutuja ainult selle ulatuse ülaossa, milles te selle deklareerisite. Kui proovite registreerida muutuja väärtus väljaspool selle deklareeritud ulatust, tekib a Viiteviga. Näiteks kui deklareerite funktsiooni sees muutuja, ei ole see väljaspool seda ulatust nähtav:

funktsioonimyFunction() {
konsool.log (foo); // määratlemata
var foo = 10;
}

myFunction();
konsool.log (foo); // ReferenceError: foo pole määratletud

Kui proovite pääseda juurde muutujale väljaspool selle ulatust, tekib a Viiteviga.

lase ja const

Vastavalt MDN kohta dokumentatsioon lase ja konst tõstmine, JavaScript tõstab ka muutujad, mis on deklareeritud lase ja konst märksõnad. Erinevalt muutujatest, mis on deklareeritud var märksõna, neid ei lähtestata tähega an määratlemata väärtus.

Näiteks:

funktsioonimyFunction() {
konsool.log (foo); // määratlemata
konsool.log (riba); // ReferenceError: enne lähtestamist ei pääse ribale juurde
konsool.log (baz); // ReferenceError: 'baz' ei pääse enne lähtestamist juurde

var foo = 5;
lase baar = 10;
konst baz = 15;
}

myFunction();

Märksõnadega let ja const deklareeritud muutujatele ei pääse juurde enne, kui olete need väärtusega initsialiseerinud.

Tõstefunktsioonid

JavaScripti tõstukid toimivad sarnaselt muutujatega. Nagu muutujate puhul, sõltub see sellest, kuidas te neid deklareerite. Näiteks JavaScript tõstab funktsioonide deklaratsioonid funktsiooniavaldistest erinevalt.

Funktsiooni deklaratsioon on nimega deklareeritud funktsioon, samas kui funktsiooni avaldis on funktsioon, mille nime saate välja jätta. Näiteks:

funktsioonifoo() {
// funktsiooni deklaratsioon
}

konst riba = () => {
// funktsiooni avaldis
}

JavaScript tõstab funktsioonide deklaratsioonid, kuid mitte funktsiooniavaldised. Näiteks:

foo(); // 5
bar(); // Tüübiviga: bar() ei ole funktsioon

// Funktsiooni deklaratsioon
funktsioonifoo() {
konsool.log(5);
}

// Funktsiooni avaldis
var baar = funktsiooniväljendus() {
konsool.log(10);
};

See kood kutsub foo enne selle funktsioonina deklareerimist ja lähtestamist, kuid see siiski logib 5 konsooli juurde. Siiski proovib helistada baar tulemuseks a Tüübiviga.

Tõstmise juhtimine

Tõstmise ja valesti haldamise korral tekkida võivate vigade teadvustamine võib säästa pikki silumistunde. Siin on mõned viisid, kuidas saate tõstmist hallata.

Funktsioonide sees olevate muutujate deklareerimine

Deklareerige muutujad funktsioonide sees, mis neile juurde pääsevad. Te ei saa seda alati teha, kuna vajate globaalset muutujat, millele pääsete juurde mitme funktsiooni kaudu. Seega veenduge, et deklareerite muutujad globaalselt ainult siis, kui seda tõesti vajate.

Muutujate deklareerimine käsuga let või const

Peaksite alati kasutama let ja const asemel märksõnad var märksõna muutujate deklareerimisel. See tava on kasulik kohalike muutujate deklareerimisel funktsiooni sees. Teades õigeid viise deklareerida muutujad JavaScriptis vähendab teie koodi tõstmisest põhjustatud vigade tõenäosust.

Deklareerige muutujad nende ulatuse tipus

Deklareerige kõik muutujad nende vastava ulatuse ülaosas, enne mis tahes muid avaldusi. See tagab, et JavaScripti kompilaator ei pea neid muutujaid neile juurdepääsuks tõstma.

Range režiimi kasutamine

Range režiim on JavaScripti režiim mis reguleerib kehva süntaksit, optimeerib teie koodi tööaega ja keelab JavaScripti lõdvalt trükitud süntaksi kuritarvitamise, tekitades kompileerimise ajal vigu.

Näiteks "lohakas režiimis" pääsete tõstmise tõttu juurde muutujale väljaspool lähtestatud funktsiooni, kuigi seda ei deklareeritud:

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

funktsioonimyFunction() {
foo = 20;
}

Ülaltoodud koodiplokis deklareerib JavaScript automaatselt foo ja tõstab selle globaalse ulatuse tippu, ignoreerides ulatust, milles te selle initsialiseerisite.

Saate selle käitumise parandamiseks kasutada ranget režiimi ja tekitada vea, kui proovite pääseda muutujale väljaspool selle funktsiooni ulatust.

Range režiim ei lõpeta tõstmist täielikult. Selle asemel hoiab see ära kõige segadusttekitavamad ja vearohkemad tõstmise viisid. Isegi range režiimi turvavõrgu kasutamisel on endiselt oluline mõista tõstmise üldist kontseptsiooni ja reegleid.

Globaalsel tasemel range režiimi lubamiseks deklareerige skriptifaili ülaosas olev süntaks:

"kasutadarange"; // või 'kasutadarange'

Funktsiooni tasemel range režiimi lubamiseks deklareerige süntaks funktsiooni keha ülaosas enne mis tahes avaldusi:

funktsioonimyStrictFunction() {
"kasutadarange";
}

Kui deklareerite funktsiooni tasemel range režiimi, rakendub säte ainult selle funktsiooni sees olevatele väidetele.

Range režiimi deklareerimine globaalsel tasandil takistab muutujatele juurdepääsu väljaspool nende vastavat ulatust:

"kasutadarange";
myFunction();
konsool.log (foo); // ReferenceError: foo pole määratletud

funktsioonimyFunction() {
foo = 20;
}

Kui range režiim on sisse lülitatud, hakkab JavaScripti kompilaator tööle myFunction() selle ulatuse tippu ilma deklareerimata muutujata.

Saate aru, mis tõstmist mõjutab

Tõstmine on JavaScripti jaoks üsna ainulaadne ja see võib olla väga segane käitumine, et pea ümber keerata. See võib mõjutada muutujaid ja funktsioone, kuid vajaduse korral on võimalusi selle vältimiseks.

Tõstmist võivad mõjutada mitmed tegurid, seega on kõige parem vältida koodis muutujate või funktsioonide tõstmist.