gpt4 book ai didi

javascript - 虽然循环崩溃,但递归函数抛出最大调用堆栈超出错误

转载 作者:行者123 更新时间:2023-11-30 06:50:12 26 4
gpt4 key购买 nike

这是一个简单的问题,但我找不到任何人解决它。

使用 chrome,在本地主机上运行程序。如果我有一个永远不会破坏条件的 while 循环,它会导致页面卡住,没有错误,我什至无法关闭 chrome 上的选项卡。

如果我有一个递归函数,它会无限地调用自己。将抛出最大调用堆栈错误。

为什么 while 循环没有故障保护?当 while 循环无限期运行时,如何避免页面卡住?(除了正确编写 while 循环)

最佳答案

你所说的故障安全是所有实现中都缺少的功能,除了 Safari,它已经实现了 tail call optimization 的 ES2016 JavaScript 要求。 .在 Safari 中,您不会注意到它们之间的任何区别:

while (true) {
// code
}

(function loop () {
// code
loop()
})();

没有堆栈溢出,正如预期的那样,浏览器永远卡住。这样做的原因是,除非你使用 worker,否则 JS 是单线程的,并且轮流队列中的其他 JS 代码不会被执行。例如。

setTimeout(function(){ alert("This will never happen!"); }, 0);
(function loop () {
loop()
})();

您不应该编写不会终止的 while 循环。如果你犯了一个错误,我建议你暂时做一个断点,以检查它为什么不终止。或者,如果您认为有问题,您可以这样做:

// TODO: remove debug limit
let limit = 100000; // limit
while (true)) {
if(!limit--) {
console.log('limit exceeded');
break; // set breakpoint here in debugger
}
}

背后是你需要在问题解决后删除它。我的 IDE 提示那个 TODO,所以它永远不会进入 git。你可以对尾调用做同样的事情:

// TODO: remove debug limit
let limit = 100000; // limit
(function loop () {
// code
if(!limit--) {
console.log('limit exceeded');
return; // set breakpoint here in debugger
}
if (true) loop(); // might have another expression than true
})();

关于javascript - 虽然循环崩溃,但递归函数抛出最大调用堆栈超出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56979530/

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