gpt4 book ai didi

javascript - javascript中第一个函数中的setTimeout()和第二个函数中的闭包是否会出现堆栈溢出错误?

转载 作者:行者123 更新时间:2023-12-01 01:19:47 24 4
gpt4 key购买 nike

工作一段时间后(计算几个小时后)是否有可能出现堆栈溢出错误?或者从长远来看还有另一个错误?

    var timerIdPrecalculationsTurns = null;

function precalculationsInit() {
if (!timerIdPrecalculationsTurns) {
timerIdPrecalculationsTurns = setTimeout(function(){
precalculationsInitClosure();
}, 10);
}
}

function precalculationsInitClosure() {
// make some calculations for ~20ms ...
// and then repeat in next iteration:
timerIdPrecalculationsTurns = null;
precalculationsInit();
}

// just start the loop
precalculationsInit();

这是我使用的代码的简化版本。但我希望它能解决我的问题。

有一些类似的答案,但我不确定是否也是我的情况:

Will setTimeOut function in recursive function cause stack overflow?

JavaScript Closures and setTimeout

最佳答案

不,不会的。

计时器“预留”回调 - 它们不会在与当前正在运行的回调(调用 setTimeout 的回调)相同的执行堆栈中调用它们。 JS 将继续执行当前脚本,直到堆栈为空,然后再调用计时器设置的任何回调(或任何已完成的异步操作)。

在您的情况下,precalculationsInit 将"dispatch"precalculationsInitClosure,然后完成执行,清空堆栈。然后至少 10 毫秒后,JS 会调用预定的 precalculationsInitClosure,做一些事情,然后调用 precalculationsInit 并重复相同的过程。

你的堆栈看起来像:

(empty)
pI (schedules pIC)
(empty, JS looks for callbacks)
pIC
pIC -> pI (schedules pIC)
pIC
(empty, JS looks for callbacks)
pIC
pIC -> pI (schedules pIC)
pIC
(empty)
...and so on

正如您所看到的,由于这种"dispatch"/“搁置”,堆栈不会像递归那样建立起来:

pI
pI -> pIC
pI -> pIC -> pI
pI -> pIC -> pI -> pIC
...and so on

关于javascript - javascript中第一个函数中的setTimeout()和第二个函数中的闭包是否会出现堆栈溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54336002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com