setTimeout(fn,200)
、ここで指定された時間は、プログラムの実行が開始されるとすぐに計算されることを意味しますか?それとも、メインスレッドのタスクが完了するまで待って、計算を開始する前に非同期タスクリストをコールバックする必要がありますか?
世界只因有你2017-07-05 11:05:30
これを説明するのは少し複雑です
まず、JavaScript がシングルスレッドであるということは、すべてのタスクをキューに入れる必要があることを理解する必要があります。すると、すべてのタスクが同期タスクと非同期タスクの 2 つのカテゴリに分類されます。同期タスク: メインスレッドで実行されるタスクは、前のタスクが完了した後にのみ次のタスクを実行します。非同期タスク: メインスレッドには入らないが「タスクキュー」に入るタスク。メインスレッド上のタスクが完了すると、メインスレッドは「タスクキュー」を実行します。
実際の実行は必ずしも 200 ミリ秒後であるとは限らず、それよりも長くなる可能性があります (メインスレッドでの同期コードの実行時間によって異なります)。 setTimeout(fn,200)
,当到200ms时,fn
会被放进“任务队列”,而“任务队列”必须要等到主线程已有的代码执行完才会执行fn
,所以当程序执行到setTimeout(fn,200)
这一行时,时间就开始计算,但是fn
欧阳克2017-07-05 11:05:30
簡単に言うとsetTimeout(fn,200)
需要等到当前函数调用栈(主进程上的同步任务)清空之后才开始执行,会在下一轮事件循环(主线程从"任务队列"中读取事件)开始时执行,setTimeout
ここで設定した時間は、イベントループの次のラウンドの開始時点からの相対的な時間間隔です。