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。因此,该方法从开始到结束都没有直接递归调用,因此调用堆栈仍然保持清晰,而不管迭代次数。
参考资料: