setTimeOut 回调函数什么时候获取参数?

when do setTimeOut callback function get its parameters?

我对 setTimeOut 的工作原理有点困惑: 为什么回调函数在调用时没有得到它需要的值,而是从脚本底部得到它们?

我预计它会打印 5 而不是 7..

我错过了什么?

感谢任何帮助,谢谢!

let foo = () => {
  console.log(x);
};

let x = 5;
setTimeout(foo, 0); //7
for (let i = 0; i < 10000000000; i++) {} //just to waste some time because the timeOut is actually 4ms
x = 7;

setTimeout的回调函数不执行直到调用堆栈为空并且调用堆栈不会'在同步 javascript 代码执行完成之前不会为空。

由于最后一条语句覆盖了x的值,当调用setTimeout的回调函数时,它记录最新的值,即7.

您似乎希望在 for 循环执行时执行 setTimeout 的回调函数,但那不是 Javascript 的工作方式。

一旦 setTimeout 的计时器到期,setTimeout 的回调函数将在任务队列中排队。从任务队列中,事件循环会将此回调推送到调用堆栈上,但回调函数不会推送到调用堆栈上 until 没有其他 javascript 代码正在执行,即 调用堆栈为空

同步脚本执行结束需要多长时间并不重要;在同步脚本执行结束之前,不会执行计划的回调。

请记住,您的所有代码都在 单线程.

上执行

另请注意,传递给 setTimeout 的毫秒数 不是 执行回调函数的确切时间;这是调用回调函数的最短时间。