Как setTimeout реализован внутри браузера?
Я знаю, как работает setTimeout, и когда таймер завершается, браузер помещает свой обратный вызов в очередь обратного вызова. Мне больше интересно, как браузер это реализовал. Я пытался заглянуть в chrome исходный код. Я нашел следующую ссылку c ++ фрагмент кода:
int WindowOrWorkerGlobalScope::setTimeout(
ScriptState* script_state,
EventTarget& event_target,
V8Function* handler,
int timeout,
const HeapVector<ScriptValue>& arguments) {
ExecutionContext* execution_context = event_target.GetExecutionContext();
if (!IsAllowed(execution_context, false, g_empty_string))
return 0;
if (timeout >= 0 && execution_context->IsDocument()) {
// FIXME: Crude hack that attempts to pass idle time to V8. This should
// be done using the scheduler instead.
V8GCForContextDispose::Instance().NotifyIdle();
}
auto* action = MakeGarbageCollected<ScheduledAction>(
script_state, execution_context, handler, arguments);
return DOMTimer::Install(execution_context, action,
base::TimeDelta::FromMilliseconds(timeout), true);
}
https://github.com/chromium/chromium/blob/2ef3297d58ea66d2d8991bb7972a093d35527287/third_party/blink/renderer/core/frame/window_or_worker_global_scope.cc
Но не в состоянии понять здесь, что происходит. Я также понимаю, что это так называемые планировщики. Но какой алгоритм он использует в случае создания множественного setTimeout. Как это происходит в памяти.