【发布时间】:2016-07-12 23:39:38
【问题描述】:
我发现了以下问题here:
下面的递归代码如果数组会导致栈溢出 列表太大。你怎么能解决这个问题并仍然保留递归 模式?
答案是:
可以通过修改 nextListItem 函数如下:
var list = readHugeList();
var nextListItem = function() {
var item = list.pop();
if (item) {
// process the list item...
setTimeout( nextListItem, 0);
}
};
堆栈溢出被消除,因为事件循环处理 递归,而不是调用堆栈。当 nextListItem 运行时,如果 item 不是 null,超时函数(nextListItem)被推送到事件队列 并且函数退出,从而使调用堆栈清除。当。。。的时候 事件队列运行它的超时事件,下一个项目被处理并且一个 计时器设置为再次调用 nextListItem。因此,该方法是 从头到尾处理,无需直接递归调用,因此 无论迭代次数如何,调用堆栈都保持清晰。
谁能给我解释一下:
- 这个用例是否实用
- 为什么长数组会导致堆栈溢出
【问题讨论】:
-
值得注意的是
setTimeout(fn, 0)并没有按预期工作:在大多数浏览器中,最小延迟是4ms。 -
@lonesomeday,是的,我知道,谢谢。我最后问的问题呢? :)
-
对我来说,给出的解释很清楚。如果你不能掌握它,你可能要从the basics开始。
标签: javascript recursion