Bagaimana perilaku hoisting variabel yang dideklarasikan di dalam loop pada JavaScript?

Hai! Saya seorang pemasok dalam bisnis pengangkatan, dan hari ini saya ingin mendalami topik yang sangat menarik dalam JavaScript: perilaku pengangkatan variabel yang dideklarasikan di dalam loop.

Pertama, mari kita bahas apa itu hoisting. Dalam JavaScript, hoisting adalah mekanisme di mana deklarasi variabel dan fungsi dipindahkan ke bagian atas cakupannya sebelum kode dieksekusi. Ini seperti mesin JavaScript yang mengambil semua deklarasi dan "mengangkatnya". Jadi, Anda bisa menggunakan variabel atau memanggil fungsi sebelum benar-benar dideklarasikan dalam kode.

Sekarang, ketika menyangkut variabel yang dideklarasikan di dalam loop, segalanya menjadi sedikit lebih rumit. Mari kita mulai dengan yang lama - sekolahkitakata kunci.

Mengangkat dengankitadi Loop

Saat Anda menggunakankitauntuk mendeklarasikan variabel di dalam loop, variabel tersebut diangkat ke bagian atas fungsi penutup atau cakupan global. Itukitakata kunci tidak memiliki cakupan tingkat blok; ia hanya memiliki tingkat fungsi atau cakupan global.

Lihatlah contoh sederhana ini:

untuk (var i = 0; i < 3; i++) { setTimeout(fungsi () { console.log(i); }, 1000); }

Dalam kode ini, kita berharap untuk melihatnya0,1, Dan2dicetak setelah satu detik. Tapi yang sebenarnya terjadi adalah itu3dicetak tiga kali. Mengapa? Ya, karena pengangkatan. Ituberada dideklarasi diangkat ke bagian atas lingkup terlampir. Pada saat itusetWaktu habispanggilan balik dieksekusi, loop telah selesai, dan nilaiSayaadalah3.

Panggilan balik disetWaktu habisfungsi menutup variabel yang samaSaya. Karena loop telah menyelesaikan eksekusinya, nilai dariSayatelah mencapai nilai akhirnya, yaitu3.

Untuk memperbaiki masalah ini dengankita, kita dapat menggunakan ekspresi fungsi yang segera dipanggil (IIFE). Begini caranya:

for (var i = 0; i < 3; i++) { (fungsi (j) { setTimeout(fungsi () { console.log(j); }, 1000); })(i); }

Dalam kode ini, kami membuat cakupan baru untuk setiap iterasi loop menggunakan IIFE. Nilai saat ini dariSayadilewatkan sebagai argumenJke IIFE, dan setiap panggilan balik disetWaktu habissekarang menutup variabel yang berbedaJ. Jadi, kami mendapatkan hasil yang diharapkan0,1, Dan2.

Mengangkat denganmembiarkanDankonstantadi Loop

ES6 diperkenalkanmembiarkanDankonstanta, yang memiliki cakupan tingkat blok. Saat Anda menggunakanmembiarkanataukonstantauntuk mendeklarasikan variabel di dalam sebuah loop, setiap iterasi dari loop mendapatkan instance variabelnya sendiri-sendiri.

Mari kita tulis ulang contoh sebelumnya menggunakanmembiarkan:

for (misalkan i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 1000); }

Kode ini akan dicetak dengan benar0,1, Dan2setelah satu detik. Itumembiarkankata kunci membuat pengikatan baru untukSayadi setiap iterasi loop. Jadi, setiap panggilan balik disetWaktu habismenutup contoh yang berbedaSaya.

Hal yang sama berlaku untukkonstanta. Jika Anda menggunakankonstantadi dalam sebuah loop, setiap iterasi juga mendapatkan instancenya sendiri, tetapi Anda tidak dapat menetapkan ulang nilai akonstantavariabel.

for (misalkan i = 0; i < 3; i++) { const j = i * 2; setTimeout(fungsi () { console.log(j); }, 1000); }

Kode ini akan dicetak0,2, Dan4setelah sedetik, seperti yang diharapkan.

Aplikasi Praktis

Memahami perilaku pengangkatan variabel dalam loop sangat penting untuk menulis kode JavaScript yang benar, terutama ketika menangani operasi asinkron sepertisetWaktu habisatau panggilan AJAX.

Misalnya, dalam skenario dunia nyata, Anda mungkin membuat aplikasi web yang mengambil data dari API untuk setiap item dalam daftar. Anda ingin memastikan bahwa setiap panggilan asinkron memiliki nilai yang benar untuk item yang digunakannya.

Katakanlah Anda menggunakan loop untuk mengulangi daftar ID produk dan membuat panggilan API untuk setiap produk. Jika Anda tidak menangani pengangkatan variabel dengan benar, Anda mungkin akan mendapatkan semua panggilan API menggunakan ID produk yang sama.

const productIds = [1, 2, 3]; for (misalkan i = 0; i < productIds.length; i++) { const productId = productIds[i]; ambil(`https://api.example.com/products/${productId}`) .then(response => respon.json()) .then(data => console.log(data)); }

Dalam kode ini, menggunakanmembiarkanmemastikan bahwa setiap panggilan API memiliki kebenaranID produk.

Terkait dengan Hoisting dalam Bisnis Kami

Sebagai pemasok pengangkat, kami menangani berbagai jenis peralatan dan mekanisme. Sama seperti bagaimana JavaScript memiliki aturan berbeda untuk pengangkatan variabelkita,membiarkan, Dankonstanta, kami memiliki peraturan dan praktik terbaik yang berbeda untuk mengangkat dimanufaktur logamindustri.

Dalam hal mengangkat struktur logam beratGambar 3D Prefabrikasi Untuk Bangunan Tinggi Baja Struktural, kita harus sangat berhati-hati dengan distribusi beban, sudut pengangkatan, dan stabilitas struktur. Setiap operasi pengangkatan seperti iterasi terpisah dalam satu lingkaran; kita perlu memastikan bahwa semua parameter disetel dengan benar untuk setiap operasi.

Demikian pula untukBangunan Baja Perumahan Tinggi Pra-rekayasa, proses pengangkatannya rumit dan memerlukan pemahaman mendalam tentang desain struktur dan kemampuan peralatan pengangkatan kami.

metal manufacturerwelding metal

Kesimpulan

Kesimpulannya, perilaku mengangkat variabel yang dideklarasikan di dalam loop dalam JavaScript bergantung pada kata kunci yang digunakan.kitamemiliki tingkat fungsi atau cakupan global, yang dapat menyebabkan hasil yang tidak diharapkan ketika digunakan dalam loop dengan operasi asinkron. Di sisi lain,membiarkanDankonstantamemiliki cakupan tingkat blok, membuat instance variabel baru di setiap iterasi loop.

Jika Anda berkecimpung dalam bisnis pembangunan struktur baja bertingkat tinggi atau industri lain yang memerlukan pengangkatan, seperti dalam JavaScript, mendapatkan detail yang tepat sangatlah penting. Baik itu cakupan variabel yang benar dalam kode atau teknik pengangkatan yang tepat untuk peralatan Anda, kesalahan kecil dapat menyebabkan masalah besar.

Jika Anda tertarik dengan layanan atau produk pengangkatan kami, jangan ragu untuk menghubungi ahubungi untuk mendiskusikan kebutuhan pengadaan Anda. Kami di sini untuk membantu Anda dengan semua persyaratan pengangkatan Anda, sama seperti kami mencoba menjelaskan perilaku pengangkatan dalam JavaScript untuk Anda.

Referensi

  • "JavaScript: Panduan Definitif" oleh David Flanagan
  • Dokumentasi JavaScript Jaringan Pengembang Mozilla (MDN).

Kirim permintaan