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
Lepaskan: 2024-12-29 07:46:15
asal
943 orang telah melayarinya

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);
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan