Skip to content

Latest commit

 

History

History
37 lines (26 loc) · 1.04 KB

File metadata and controls

37 lines (26 loc) · 1.04 KB

17、如果数组列表太大,下面的递归代码将导致堆栈溢出。您如何修复并保留递归模式?

var list = readHugeList();

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

    if (item) {
        // process the list item...
        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。因此,该方法从开始到结束都没有直接递归调用,因此调用堆栈仍然保持清晰,而不管迭代次数。

参考资料:

题目来源