Az Önhöz hasonló olvasók támogatják a MUO-t. Amikor a webhelyünkön található linkek használatával vásárol, társult jutalékot kaphatunk.
Az emelés egy JavaScript-mechanizmus, amely lehetővé teszi a változók és funkciók elérését, mielőtt inicializálná őket. Egy ilyen nyilatkozat felemelése hatékonyan a hatókörének csúcsára helyezi azt.
Tudjon meg mindent arról, hogyan működik az emelés a JavaScriptben, és hogyan kezelheti a legjobban, hogy elkerülje a hibákat a kódban.
Emelési változók Var, let és const
Az emelés azért lehetséges, mert a JavaScript a JIT (Just-in-Time) fordítási rendszert használja, amely átvizsgálja a kódot, hogy azonosítsa az összes változót a megfelelő hatókörükben.
A JIT fordító ezután a változódeklarációk összes példányát a hatókörük tetejére emeli fordításkor. A JavaScript csak a változók deklarációit emeli ki, inicializálásukat nem.
A változók viselkedése felhúzáskor attól függ, hogy melyik kulcsszóval deklaráltad őket, mivel minden kulcsszó eltérően viselkedik.
var
Hozzáférés egy inicializálatlan változóhoz, amelyet a var kulcsszó visszatér határozatlan. Például:
konzol.log (foo); // határozatlan
var foo = 2;
A fenti kód naplózza határozatlan mert hív console.log mielőtt inicializálná a változót.
A JavaScript fordító az előző kódblokkot így nézi meg:
var foo;
konzol.log (foo); // határozatlan
foo = 2;
Az emelés során a változók engedelmeskednek a a JavaScript hatókörének szabályai. A Javascript csak a hatókör tetejére emeli a változót, amelyben deklarálta. Ha megpróbálja naplózni egy változó értékét a deklarált hatókörén kívül, az a ReferenceError. Például, ha egy változót deklarál egy függvényen belül, az nem lesz látható azon a hatókörön kívül:
funkciómyFunction() {
konzol.log (foo); // határozatlan
var foo = 10;
}
myFunction();
konzol.log (foo); // ReferenceError: a foo nincs megadva
Ha megpróbál hozzáférni egy változóhoz a hatókörén kívül, az a ReferenceError.
let és const
Szerint a MDN dokumentációt hagyja és const emelés, A JavaScript a következővel deklarált változókat is felemeli hagyja és const kulcsszavakat. Azonban ellentétben a változókkal deklarált var kulcsszó, nem inicializálják őket határozatlan érték.
Például:
funkciómyFunction() {
konzol.log (foo); // határozatlan
konzol.log (sáv); // ReferenceError: Nem lehet elérni a 'sávot' inicializálás előtt
konzol.log (baz); // ReferenceError: Nem lehet elérni a „baz” fájlt inicializálás előttvar foo = 5;
hagyja bár = 10;
const baz = 15;
}
myFunction();
Nem érheti el a let és const kulcsszavakkal deklarált változókat, mielőtt értékkel inicializálná őket.
Emelési funkciók
A JavaScript emelők a változókhoz hasonlóan működnek. A változókhoz hasonlóan ez is attól függ, hogyan deklarálja őket. Például a JavaScript a függvénydeklarációkat a függvénykifejezésektől eltérően emeli ki.
A függvénydeklaráció névvel deklarált függvény, míg a függvénykifejezés olyan függvény, amelynek nevét elhagyhatja. Például:
funkciófoo() {
// függvény deklaráció
}
const bár = () => {
// függvény kifejezés
}
A JavaScript funkciódeklarációkat emel, de nem függvénykifejezéseket. Például:
foo(); // 5
rúd(); // TypeError: a bar() nem függvény// Funkciónyilatkozat
funkciófoo() {
konzol.log(5);
}
// Funkciókifejezés
var bár = funkciókifejezés() {
konzol.log(10);
};
Ez a kód hív foo mielőtt deklarálja és függvényként inicializálja, de továbbra is naplózza 5 a konzolhoz. Azonban próbál hívni rúd eredménye a TypeError.
Emelés kezelése
Ha tisztában van az emeléssel és a helytelen kezelés esetén fellépő lehetséges hibákkal, hosszú órákig tartó hibakeresést takaríthat meg. Íme néhány módja az emelés kezelésének.
Változók deklarálása a függvényeken belül
Deklaráljon változókat a hozzájuk férő függvényeken belül. Ezt nem mindig tudja megtenni, mivel szükség lehet egy globális változóra, amelyet több függvényen belül is elérhet. Tehát győződjön meg arról, hogy csak akkor deklarálja a változókat globálisan, ha valóban szükséges.
Változók deklarálása let vagy const
Mindig használja az let és const kulcsszavak helyett a var kulcsszó a változók deklarálásakor. Ez a gyakorlat akkor hasznos, ha lokális változókat deklarál egy függvényen belül. A megfelelő módok ismerete változók deklarálása JavaScriptben csökkenti a kódban fellépő emelés okozta hibák esélyét.
A hatókörük tetején lévő változók deklarálása
Deklarálja az összes változót a megfelelő hatókörük tetején, minden más utasítás előtt. Ezzel biztosítható, hogy a JavaScript-fordítónak ne kelljen felemelnie ezeket a változókat, hogy elérje őket.
Szigorú mód használata
A szigorú mód JavaScript mód amely szabályozza a rossz szintaxist, optimalizálja a kód futási idejét, és megtiltja a JavaScript lazán beírt szintaxisával való visszaélést azáltal, hogy fordítási hibákat dob fel.
Például „hanyag módban” az emelés miatt hozzáférhet egy változóhoz az inicializált függvényen kívül, még akkor is, ha nem volt deklarálva:
myFunction();
konzol.log (foo); // 20
funkciómyFunction() {
foo = 20;
}
A fenti kódblokkban a JavaScript automatikusan deklarálja foo és a globális hatókör tetejére emeli, figyelmen kívül hagyva azt a hatókört, amelyben inicializálta.
Szigorú móddal javíthatja ezt a viselkedést, és hibát jelezhet, ha a függvény hatókörén kívül próbálja elérni a változót.
A szigorú üzemmód nem hagyja abba az emelést. Ehelyett megakadályozza az emelés leginkább zavaró és hibás formáit. Továbbra is fontos megérteni az általános koncepciót és az emelés mögötti szabályokat, még a szigorú módú biztonsági háló használata esetén is.
A szigorú mód globális szintű bekapcsolásához deklarálja a szintaxist a szkriptfájl tetején:
"használatszigorú"; // vagy "használatszigorú'
A szigorú mód függvényszintű beállításához deklarálja a szintaxist a függvénytörzs tetején az utasítások előtt:
funkciómyStrictFunction() {
"használatszigorú";
}
Ha egy függvényszinten szigorú módot deklarál, a beállítás csak az adott függvényen belüli utasításokra vonatkozik.
A szigorú mód globális szintű deklarálása megakadályozza a változókhoz való hozzáférést a megfelelő hatókörükön kívül:
"használatszigorú";
myFunction();
konzol.log (foo); // ReferenceError: a foo nincs megadva
funkciómyFunction() {
foo = 20;
}
Ha a szigorú mód be van kapcsolva, a JavaScript-fordító aktiválódik myFunction() hatókörének tetejére a nem deklarált változó nélkül.
Ismerje meg, mi befolyásolja az emelést
Az emelés meglehetősen egyedi a JavaScriptben, és nagyon zavaró viselkedés lehet, ha körbetekerné a fejét. Ez hatással lehet a változókra és a függvényekre, de van mód arra, hogy megakadályozzuk, ha szükséges.
Számos tényező befolyásolhatja az emelést, ezért a legjobb, ha elkerüli a változó vagy funkció emelését a kódban.