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
的毫秒数 不是 执行回调函数的确切时间;这是调用回调函数的最短时间。
我对 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
的毫秒数 不是 执行回调函数的确切时间;这是调用回调函数的最短时间。