Hogyan viselkednek a JavaScript ciklusokban deklarált változók az emelés során?
Szia! Beszállító vagyok az emelőágazatban, és ma szeretnék belemerülni egy szuper érdekes JavaScript témába: a hurkon belül deklarált változók emelési viselkedésébe.
Először is nézzük meg gyorsan, mi az az emelés. A JavaScriptben az emelés egy olyan mechanizmus, amelyben a változók és függvények deklarációi a kód végrehajtása előtt a hatókörük tetejére kerülnek. Ez olyan, mintha a JavaScript motor felveszi az összes deklarációt és "felemeli" azokat. Tehát használhat egy változót vagy hívhat meg egy függvényt, mielőtt ténylegesen deklarálná a kódban.
Most, amikor a ciklusokon belül deklarált változókról van szó, a dolgok egy kicsit bonyolultabbak. Kezdjük a régi iskolávala miénkkulcsszó.
Emelés aa miénka Loopsban
Amikor használoda miénkegy hurkon belüli változó deklarálásához az a változó a befoglaló függvény vagy a globális hatókör tetejére kerül. Aa miénka kulcsszónak nincs blokk szintű hatálya; csak funkciója van - szintű vagy globális hatóköre.
Vessen egy pillantást erre az egyszerű példára:
for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 1000); }
Ebben a kódban azt várjuk, hogy meglátjuk0,1, és2egy másodperc múlva kinyomtatják. De ami valójában történik, az az3háromszor nyomtatják ki. Miért? Hát az emelés miatt. Abent voltnyilatkozatot a befoglaló távcső tetejére kell felemelni. Mire asetTimeouta visszahívások végrehajtásra kerülnek, a ciklus már befejeződött, és az értékeénvan3.
A visszahívások asetTimeoutA függvények ugyanazon a változó felett záródnakén. Mivel a ciklus befejezte a végrehajtást, az értékeénelérte végső értékét, ami az3.
A probléma megoldásáhoza miénk, használhatunk egy azonnal meghívott függvénykifejezést (IIFE). Íme, hogyan:
for (var i = 0; i < 3; i++) { (function (j) { setTimeout(function () { console.log(j); }, 1000); })(i); }
Ebben a kódban új hatókört hozunk létre a hurok minden iterációjához az IIFE használatával. A jelenlegi értékeénérvként adják átjaz IIFE-hez, és minden visszahívás asetTimeoutmost egy másik változó felett zárj. Tehát megkapjuk a várt eredményt0,1, és2.
Emelés ahagyjaésconsta Loopsban
Bemutatták az ES6-othagyjaésconst, amelyek blokk szintű hatókörrel rendelkeznek. Amikor használodhagyjavagyconsta cikluson belüli változó deklarálásához a ciklus minden iterációja megkapja a változó különálló példányát.
Írjuk át az előző példát a segítségévelhagyja:
for (legyen i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 1000); }
Ez a kód megfelelően kinyomtatásra kerül0,1, és2egy másodperc után. Ahagyjakulcsszó új kötést hoz létre a számáraéna ciklus minden iterációjában. Tehát minden visszahívás asetTimeoutegy másik példánya felett zár beén.
Ugyanez vonatkozikconst. Ha használconstcikluson belül minden iteráció saját példányt is kap, de nem lehet újra hozzárendelni egyconstváltozó.
for (legyen i = 0; i < 3; i++) { const j = i * 2; setTimeout(function () { console.log(j); }, 1000); }
Ez a kód kinyomtatásra kerül0,2, és4egy másodperc múlva, ahogy az várható volt.
Gyakorlati alkalmazások
A hurokban lévő változók emelési viselkedésének megértése döntő fontosságú a helyes JavaScript-kód írásához, különösen akkor, ha olyan aszinkron műveletekkel foglalkozunk, mint pl.setTimeoutvagy AJAX hívások.
Valós forgatókönyv esetén például létrehozhat egy webalkalmazást, amely a lista minden eleméhez adatokat kér le egy API-ból. Győződjön meg arról, hogy minden aszinkron hívás a megfelelő értékkel rendelkezik annak az elemnek, amellyel dolgozik.
Tegyük fel, hogy egy ciklust használ a termékazonosítók listájának iterálásához, és API-hívások végrehajtásához minden egyes termékhez. Ha nem kezeli megfelelően a változó emelést, előfordulhat, hogy az összes API-hívás ugyanazt a termékazonosítót használja.
const productIds = [1, 2, 3]; for (legyen i = 0; i < productIds.length; i++) { const productId = termékazonosítók[i]; fetch(`https://api.example.com/products/${productId}`) .then(response => response.json()) .then(data => console.log(data)); }
Ebben a kódban ahagyjabiztosítja, hogy minden API-hívás megfelelő legyentermékazonosító.
Vállalkozásunkban az emeléssel kapcsolatos
Emelőbeszállítóként különböző típusú berendezésekkel és mechanizmusokkal foglalkozunk. Csakúgy, mint ahogy a JavaScript eltérő szabályokkal rendelkezik a változó emelésrea miénk,hagyja, ésconst, különböző szabályaink és bevált gyakorlataink vannak az emelésre afémgyártásipar.
Amikor nehézfém szerkezetek emeléséről van szóElőregyártott 3D-s rajz acélszerkezeti magasépítéshez, nagyon ügyelnünk kell a teherelosztásra, az emelési szögre és a szerkezet stabilitására. Minden egyes emelési művelet olyan, mint egy különálló iteráció egy hurokban; biztosítanunk kell, hogy minden paraméter helyesen legyen beállítva minden művelethez.
Hasonlóképpen aElőre megtervezett Highrise Residential Steel Building, az emelési folyamat összetett, és megköveteli a szerkezet kialakításának és emelőberendezéseink képességeinek mély megértését.


Következtetés
Összefoglalva, a JavaScript-ben a ciklusokon belül deklarált változók emelési viselkedése a használt kulcsszótól függ.a miénkfunkciószintű vagy globális hatókörrel rendelkezik, ami váratlan eredményekhez vezethet, ha aszinkron műveletekkel rendelkező ciklusokban használják. Másrészt,hagyjaésconstblokkszintű hatókörrel rendelkeznek, és a ciklus minden iterációjában létrehozzák a változó új példányát.
Ha magas magasságú acélszerkezetek építésével foglalkozik, vagy bármely más olyan iparággal foglalkozik, amely emelést igényel, akárcsak a JavaScript esetében, a részletek pontos meghatározása döntő fontosságú. Legyen szó a helyes változó hatókörről a kódban vagy a berendezés megfelelő emelési technikájáról, az apró hibák nagy problémákhoz vezethetnek.
Ha felkeltette érdeklődését emelő szolgáltatásaink vagy termékeink, ne habozzon kapcsolatba lépni avegye fel a kapcsolatot, hogy megbeszéljük beszerzési igényeit. Azért vagyunk itt, hogy segítsünk Önnek minden emelési követelményében, éppúgy, mint ahogyan megpróbáltuk megvilágítani az Ön számára a JavaScript emelési viselkedését.
Hivatkozások
- „JavaScript: A végleges útmutató”, David Flanagan
- Mozilla Developer Network (MDN) JavaScript dokumentáció
