Как webapi выполняет settimeout javascript - PullRequest
0 голосов
/ 01 апреля 2020

У меня путаница в связи с тем, что после завершения settimeout то, что он помещает в очередь обратного вызова, помещает ли оно определение функции / определение функции (которое мы передаем в качестве параметра в settimeout) или вызываемую функцию

function cb(){
  console.log("Hi!")
}
setTimeout(cb,2000) // what will be put on the callback queue after 2 sec cb or cb()

так что теперь, если я позвоню setTimeout(cb,2000) после этого, что он поместит в очередь обратного вызова, просто cb or cb()

, и если я предполагаю, что он ставит просто cb вот так, и когда событие l oop помещает cb в стеке вызовов он будет выполнять функцию cb. Так что, если это так, то если у меня есть:

function cb(num){
      console.log(num);
      console.log("Hi!")
    }

и вызову setTimeout(cb,2000,5), то для этого случая после того, как таймер завершен и если он помещает только cb затем в очереди обратного вызова, когда событие l oop помещает cb в стек вызовов, как он запоминает или передает ему параметр num (в данном случае значение 5), когда он записывает 5 в консоль.

Любая помощь очень ценится, поскольку я не могу установить ментальную модель для этой путаницы.

1 Ответ

0 голосов
/ 01 апреля 2020

Когда вы делаете setTimeout (cb, 2000,5). Вы помещаете 3 аргумента в стек базовой реализации:

  • адрес cb функция
  • целое число 2000
  • целое число 5

Chrome (или используемая вами реализация Node или w / e) нативный API вызывается с этими аргументами. Обратите внимание, что setTimeout это НЕ часть javascript v8 движка.

Я не проверял исходный код, но я верю, что происходит дальше: Событие l oop вычисляет новое время и запоминает его вместе с адресом памяти функции обратного вызова и другими аргументами. Когда придет время, собственный API активируется и запускает собственный код, который вызывает обратный вызов и его аргументы. Итак:

setTimeout(function() {console.log(arguments)}, 1, 2, 3, 4)
// prints [2, 3, 4]

Тот факт, что вам это может быть интересно, что ссылка на функцию может содержать аргументы с ней:

b = function(){console.log(arguments)}
ba = b.bind(1,2,3)
setTimeout(ba, 4,5,6)
// prints [2, 3, 5, 6]
// where 1 is this, and 4 is the timeout
...