//Kemas kini: Soalan ini tidak mempunyai nilai rujukan dan agak mengelirukan saya telah memohon untuk menutupnya. Untuk butiran, sila lihat jawapan saya di bawah
Saya melihat blog yang disebut dua hari lalu: Jika masa pelaksanaan fungsi panggil balik setInterval lebih besar daripada masa tunda yang ditentukan, apabila pemasa dicetuskan, jika baris gilir tugas mempunyai fungsi panggil balik untuk pemasa yang sama, maka panggil balik ini akan Diabaikan, yang bermaksud bahawa tidak akan ada dua atau lebih fungsi panggil balik pemasa yang sama dalam baris gilir tugas. Kenyataan tidak jelas, lihat sahaja kod:
(function(){
var j=1;
var start=new Date().getTime();
var timr=setInterval(function(){
console.log("第"+j+"次定时器开始时间:"+(new Date().getTime()-start));
for(var i=0;i<5000;i++){console.log("")};
console.log("第"+j+"次定时器结束时间:"+(new Date().getTime()-start));
j++;
},100);
setTimeout(function(){
clearInterval(timr)
},1000)
})()
setInterval menambah fungsi pada baris gilir tugas setiap 100ms, dan setInterval dikosongkan selepas 1000ms. Terangkan keputusan ini mengikut pernyataan di atas:
Letakkan gelung untuk pertama ke dalam baris gilir tugasan pada 100ms, dan utas utama terbiar mula melaksanakan gelung ini, yang mengambil masa 863ms
Semasa pelaksanaan gelung pertama, pemasa kedua dicetuskan pada 200ms, dan gelung kedua untuk dimasukkan ke dalam baris gilir tugasan kosong sehingga utas utama melahu dan mula melaksanakan gelung kedua selepas 964ms;
Pada 900ms, pemasa kesembilan dicetuskan, dan utas utama melaksanakan gelung kedua untuk fungsi pemasa ini tidak wujud dalam baris gilir tugas, jadi fungsi pemasa ini dimasukkan ke dalam baris gilir tugas, iaitu. hasilnya. "pemasa ke-3"
Pada 1000ms, pemasa kesepuluh dicetuskan dan diabaikan atas sebab yang sama seperti pemasa ketiga Selepas itu, setInterval dikosongkan.
Contoh 2
for(var i=0;i<10000;i++){
console.log(1)
}
setInterval(function(){
console.log("定时器")
},1000)
Soalan
Dua contoh di atas bercanggah Bagaimanakah setInterval berfungsi dalam kes ini? Saya harap saya dapat memberi anda jawapan yang jelas, sebaik-baiknya dengan maklumat yang berwibawa. Terima kasih Dakar.
Saya bertanya soalan ini, dan sekarang saya sedar ia agak mengelirukan. . .
Dalam contoh kedua, benang js telah diduduki semasa pelaksanaan gelung for, dan pernyataan berikut belum dihuraikan, iaitu pemasa belum didaftarkan. Ubah suai contoh dan tambah masa pelaksanaan:
Ia akan menjadi jelas apabila anda menggunakan contoh ini untuk ujian. Gelung untuk di atas dilaksanakan selama kira-kira 1544ms Pada masa ini, utas js menghuraikan pernyataan, pemasa telah didaftarkan, dan kemudian dilaksanakan seperti biasa.
Jadi tiada percanggahan antara dua contoh Contoh pertama adalah betul Apabila utas utama melaksanakan fungsi pemasa dan baris gilir tugasan mempunyai fungsi pemasa yang sama, semua pencetus pemasa akan diabaikan.
Walau bagaimanapun, Contoh 2 untuk setInterval tidak dilaksanakan sebelum tamat