【发布时间】:2015-09-23 20:19:00
【问题描述】:
如果数组列表太大,为什么下面的递归代码会导致堆栈溢出?我怎样才能解决这个问题并仍然保留递归模式?
var list = readHugeList();
var nextListItem = function() {
var item = list.pop();
if (item) {
// process the list item...
nextListItem();
}
};
【问题讨论】:
-
JavaScript 的调用堆栈大小非常有限。我相信当为 ES6 更新实现时这应该会改变,因为正确的尾调用是规范 IIRC 的一部分。要修复它,您需要以异步批处理的方式进行,但这会使您的代码需要回调。
-
@squint 另外,某些浏览器上的最大调用堆栈略高于 1400。Opera 12.17 及以下版本就是这种情况。一个解决方案是使用 1 毫秒的
setTimeout。 -
您可以在这里找到一些浏览器堆栈大小:stackoverflow.com/questions/7826992/…
-
@IsmaelMiguel 我需要递归解决方案,正如您之前提到的,使用 setTimeout 有效,所以我接受了答案。
-
好吧。请考虑这次。我会记住这些事情的。我是 stackoverflow 的新手,所以我正在学习它的流程
标签: javascript