webapi如何执行settimeout javascript

webapi如何执行settimeout javascript,javascript,event-loop,webapi,Javascript,Event Loop,Webapi,我对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)之后,它会在回调队列中放入什么呢 如果我假设它这

我对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,当eventloop将cb放入调用堆栈时,它将执行cb函数 如果是这样,那么如果我有:

function cb(num){
      console.log(num);
      console.log("Hi!")
    }
并调用
setTimeout(cb,2000,5)
因此,对于这种情况,在计时器完成后,如果它只将cb放入回调队列中,那么当事件循环将cb放入调用堆栈时,它如何记住或将num参数(本例中的值5)传递给控制台

非常感谢您的帮助,因为我无法为这种混乱建立一个心智模型。

当您设置超时时(cb,2000,5)。您正在将3个参数推送到底层实现的堆栈中:

  • cb
    功能的地址
  • 整数2000
  • 整数5
Chrome(或您使用的节点或w/e实现)本机API使用这些参数进行调用。请注意,
setTimeout
这是而不是
javascript
v8
引擎的一部分

我没有检查源代码,但我相信接下来会发生的事情是:事件循环计算一个新的时间,并记住它以及回调函数和其他参数的内存地址。当时间到来时,本机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

向我们展示完整的代码这不是关于代码的内容我想知道web api在回调队列上放了什么它放了回调函数定义(我们传递给setTimeout的参数或回调)还是放了回调函数,而是回调队列中调用的回调函数
setTimeout(cb,2000)
。调用
setTimeout
时,
cb
指向的函数的地址。该地址的内存包含
cb
函数的字节码我无法理解你能不能先详细说明一下我想要一个简短的答案,在setTimeout运行2秒后,我们将在callbackqueue中放入什么?要设置Timeout的回调函数或调用的回调函数的地址