Rumah  >  Artikel  >  hujung hadapan web  >  Bolehkah Penutupan JavaScript Di Dalam Gelung Memecah Skop Pembolehubah?

Bolehkah Penutupan JavaScript Di Dalam Gelung Memecah Skop Pembolehubah?

DDD
DDDasal
2024-10-16 17:51:02788semak imbas

Can JavaScript Closures Inside Loops Break Variable Scoping?

Penutupan JavaScript di dalam Gelung: Contoh Praktikal Ringkas

Dalam JavaScript, isu biasa timbul apabila menggunakan gelung untuk mencipta fungsi yang mencatat indeks atau nilainya. Walaupun berhasrat untuk mengelog nilai yang berbeza, semua fungsi sering berakhir dengan mengelog nilai yang sama disebabkan sifat skop pembolehubah.

Masalahnya

Pertimbangkan kod berikut:

<code class="javascript">var funcs = [];
for (var i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value:", i);
  };
}

for (var j = 0; j < 3; j++) {
  funcs[j](); // Outputs: "My value: 3" three times
}</code>

Daripada mengeluarkan "Nilai saya: 0", "Nilai saya: 1" dan "Nilai saya: 2", ia mencatatkan "Nilai saya: 3" tiga kali. Tingkah laku ini berterusan merentas senario yang berbeza, termasuk menggunakan pendengar acara atau kod tak segerak.

Penyelesaian 1: ES6 membolehkan

ES6 memperkenalkan kata kunci let, yang mencipta pembolehubah yang diskop ke blok lampirannya. Menggunakan let dalam gelung memastikan setiap fungsi mempunyai pembolehubah tersendiri:

<code class="javascript">for (let i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value:", i);
  };
}</code>

Penyelesaian 2: ES5.1 forEach

Untuk senario yang melibatkan lelaran ke atas tatasusunan, forEach kaedah menyediakan penyelesaian yang mudah. Setiap panggilan balik dalam gelung forEach mempunyai penutupannya sendiri, menyediakan pembolehubah unik untuk setiap lelaran:

<code class="javascript">someArray.forEach(function(arrayElement) {
  console.log("My value:", arrayElement);
});</code>

Penyelesaian 3: Penutupan Klasik

Dalam versi JavaScript yang lebih lama, penutupan boleh digunakan untuk mengikat pembolehubah kepada nilai tertentu dalam fungsi:

<code class="javascript">var funcs = [];

function createfunc(i) {
  return function() {
    console.log("My value:", i);
  };
}

for (var i = 0; i < 3; i++) {
  funcs[i] = createfunc(i);
}</code>

Atas ialah kandungan terperinci Bolehkah Penutupan JavaScript Di Dalam Gelung Memecah Skop Pembolehubah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn