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.
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.
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>
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>
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!