使用setTimeout函数解决栈溢出问题

Posted Orange

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用setTimeout函数解决栈溢出问题相关的知识,希望对你有一定的参考价值。

下面的代码,如果队列太长会导致栈溢出,怎样解决这个问题并且依然保持循环部分:

var list = readHugeList();
var nextListItem = function() {
    var item = list.pop();
    if (item) {
        // process the list item...
        nextListItem();
    }
};

通过修改nextListItem功能可以避免潜在的堆栈溢出,如下所示:

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        setTimeout( nextListItem, 0);
    }
};

栈溢出主要是因为循环事件,而不是栈。当执行nextListItem时,如果item不是null,在settimeout函数中的nextListItem会推入到事件队列中。当事件空闲,则会执行nextListItem,因此,这种方法从开始到结束没有直接进行循环调用,可以不用考虑循环次数。

以上是关于使用setTimeout函数解决栈溢出问题的主要内容,如果未能解决你的问题,请参考以下文章

如何解决栈溢出

为啥带有 setTimeout 的函数不会导致堆栈溢出

?浏览器特性

栈溢出原理

递归调用太深,可能导致栈溢出

java栈内存溢出怎么解决