Rumah >hujung hadapan web >tutorial js >Mengapa For-Loop dengan setTimeout Mencetak Nilai Tidak Dijangka?

Mengapa For-Loop dengan setTimeout Mencetak Nilai Tidak Dijangka?

Patricia Arquette
Patricia Arquetteasal
2024-12-29 07:46:15924semak imbas

Why Does a For-Loop with setTimeout Print Unexpected Values?

Untuk Gelung Dibalut dalam setTimeout Mencetak Nilai Yang Tidak Dijangka

Dalam skrip ini, gelung untuk berulang dengan pembolehubah i daripada 1 hingga 2, dan dalam gelung, fungsi tamat masa ditetapkan dengan kelewatan 100 milisaat untuk memaklumkan nilai i apabila ia melaksanakan. Walau bagaimanapun, gelagat yang dijangkakan adalah untuk skrip mencetak 1 dan 2 berturut-turut, tetapi sebaliknya, 3 dimaklumkan dua kali.

Tingkah laku yang tidak dijangka berpunca daripada fakta bahawa i dikongsi sepanjang gelung dan diubah suai sebagai gelung maju. Apabila fungsi tamat masa dilaksanakan, saya telah pun mencapai 3, membawa kepada kedua-dua makluman memaparkan nilai tersebut.

Untuk menyelesaikan isu ini dan memastikan nilai cetakan berturut-turut, adalah perlu untuk membuat salinan berasingan bagi setiap fungsi tamat masa . Ini boleh dicapai dengan mentakrifkan fungsi khusus, doSetTimeout, yang mengambil i sebagai hujah dan menetapkan tamat masa menggunakan nilai khusus tersebut.

Skrip yang diubah suai menggunakan doSetTimeout adalah seperti berikut:

function doSetTimeout(i) {
  setTimeout(function() {
    alert(i);
  }, 100);
}

for (var i = 1; i <= 2; ++i)
  doSetTimeout(i);

Dengan pengubahsuaian ini, setiap lelaran gelung mencipta salinan baharu i yang dihantar ke doSetTimeout, memastikan setiap tamat masa dilaksanakan dengan nilai yang betul.

Atas ialah kandungan terperinci Mengapa For-Loop dengan setTimeout Mencetak Nilai Tidak Dijangka?. 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