Dalam pengaturcaraan, penutupan memainkan peranan penting dalam menangkap pembolehubah dari skop luar. Walau bagaimanapun, apabila digunakan dalam gelung, ia boleh membawa kepada hasil yang tidak dijangka yang dikenali sebagai pencemaran penutupan. Artikel ini meneroka masalah ini dan menyediakan penyelesaian praktikal untuk menyelesaikannya.
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](); }</code>
Malangnya, kod ini mengeluarkan:
<code>My value: 3 My value: 3 My value: 3</code>
bukannya:
<code>My value: 0 My value: 1 My value: 2</code>
Masalah timbul kerana setiap fungsi yang diisytiharkan dalam gelung menangkap pembolehubah i
yang sama dari skop luar. Apabila fungsi digunakan dalam gelung kedua, kesemuanya merujuk pada i
yang sama, yang telah ditambah kepada 3 pada masa ia dilaksanakan.
let
ES6 memperkenalkan kata kunci let
, yang mencipta pembolehubah berskop blok. Menggunakan let
dalam gelung memastikan setiap lelaran mempunyai pembolehubah i
tersendiri, menyelesaikan isu pencemaran penutupan:
<code class="javascript">for (let i = 0; i < 3; i++) { funcs[i] = function() { console.log("My value:", i); }; }</code>
forEach
Satu lagi penyelesaian untuk tatasusunan ialah menggunakan kaedah forEach
:
<code class="javascript">var someArray = [/* values */]; someArray.forEach(function(element) { // ...code specific to this element... });</code>
Setiap lelaran gelung forEach
mencipta penutupannya sendiri, menangkap elemen tatasusunan khusus untuk lelaran itu.
Penyelesaian klasik melibatkan pengikatan pembolehubah secara manual kepada nilai yang berasingan dan tidak berubah di luar 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); } for (var j = 0; j < 3; j++) { funcs[j](); }</code>
Dengan menghantar pembolehubah i
sebagai hujah kepada bahagian dalam fungsi, kami membuat penutupan baharu untuk setiap lelaran, memastikan setiap fungsi merujuk nilai bebasnya sendiri.
Atas ialah kandungan terperinci Cara Mengatasi Pencemaran Penutupan dalam Gelung: Panduan Praktikal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!