setTimeout(fn,200)
, adakah masa yang dinyatakan di sini bermakna ia dikira sebaik sahaja program mula berjalan? Atau patutkah kita menunggu sehingga tugas utas utama selesai dan memanggil semula senarai tugas tak segerak sebelum memulakan pengiraan?
Ini agak rumit untuk diterangkan
Pertama sekali, anda mesti faham bahawa Javascript adalah single-threading bermakna semua tugasan perlu beratur. Kemudian semua tugas akan dibahagikan kepada dua kategori: tugas segerak dan tugas tak segerak! Tugasan segerak: Tugasan yang dilaksanakan pada utas utama hanya akan melaksanakan tugasan seterusnya selepas tugasan sebelumnya selesai! Tugasan tak segerak: Tugasan yang tidak memasuki utas utama tetapi memasuki "baris gilir tugasan".
Untuk
setTimeout(fn,200)
,当到200ms时,fn
会被放进“任务队列”,而“任务队列”必须要等到主线程已有的代码执行完才会执行fn
,所以当程序执行到setTimeout(fn,200)
这一行时,时间就开始计算,但是fn
masa pelaksanaan sebenar tidak semestinya selepas 200ms, mungkin selepas masa yang lebih lama (bergantung pada masa pelaksanaan kod penyegerakan pada utas utama).Secara ringkasnya
setTimeout(fn,200)
需要等到当前函数调用栈(主进程上的同步任务)清空之后才开始执行,会在下一轮事件循环(主线程从"任务队列"中读取事件)开始时执行,setTimeout
Hanya acara yang dimasukkan ke dalam "barisan tugasan." Masa yang ditetapkan di sini ialah selang relatif kepada masa pada permulaan pusingan acara seterusnya.Masa bermula apabila
setTimeout(fn,200)
dipanggil.