Soalan
Anda mungkin menghadapi masalah apabila melaksanakan gelung tak segerak.
Mari cuba menulis kaedah tak segerak yang mencetak nilai indeks gelung sekali dalam gelung.
<script> for(var i = 0; i < 5; i++){ setTimeout(function(){ document.writeln(i);document.writeln("<br />"); },1000); } </script>
Output program di atas ialah:
5
5
5
5
5
Sebab
Setiap tamat masa (masa tamat) menunjuk kepada i asal, bukan salinannya. Jadi, gelung for menambah i kepada 5, kemudian tamat masa berjalan dan memanggil nilai semasa i (iaitu 5).
Penyelesaian
Terdapat beberapa cara berbeza untuk menyalin i. Kaedah yang paling biasa dan biasa digunakan ialah membuat penutupan dengan mengisytiharkan fungsi dan menghantar i kepada fungsi ini. Kami menggunakan fungsi panggilan kendiri di sini.
Jalankan kod
<script> for(var i = 0; i < 5; i++){ (function(num){ setTimeout(function(){ document.writeln(num);document.writeln("<br />"); },1000); })(i); } </script>
Output
0
1
2
3
4