16.下面的递归代码在数组列表偏大的情况下会导致堆栈溢出。在保留递归模式的基础上,你怎么解决这个问题?

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不为空,timeout函数(nextListItem)就会被推到事件队列,该函数退出,因此就清空调用堆栈。当事件队列运行其timeout事件,且进行到下一个 item 时,定时器被设置为再次调用 nextListItem。因此,该方法从头到尾都没有直接的递归调用,所以无论迭代次数的多少,调用堆栈保持清空的状态。

最新文章

  1. STM32_RTC君
  2. CSS3图片缩放
  3. 关于Scala JDK与IDEA版本兼容的问题
  4. 【转】asp.net c# 网上搜集面试题目大全(附答案)
  5. HDU 4888 Redraw Beautiful Drawings(最大流+判最大流网络是否唯一)
  6. win7下制作ubuntu系统安装启动盘和U盘安装ubuntu全过程
  7. mysql学习笔记之基础篇
  8. redis常见错误
  9. oracle图形界面乱码
  10. .Net 官方学习文档
  11. php获取二维数组中某一列的值集合
  12. 关于HTML使用ComDlg ActiveX 无法弹出相应对话框的问题1
  13. [Swift]LeetCode942. 增减字符串匹配 | DI String Match
  14. Petrozavodsk Winter-2018. Carnegie Mellon U Contest
  15. configure,make,make install作用和关系的一些理解
  16. spring boot 常见的配置问题
  17. WEBSERVICE-AXIS2服务端代码
  18. 各种hash函数
  19. 站点默认访问https
  20. jQuery对象扩展方法(Extend)深度解析

热门文章

  1. WebService之CXF注解之三(Service接口实现类)
  2. ORA-00922:选项缺失或无效
  3. 常用javascript表单验证方法
  4. C# md5加密方法
  5. TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array。
  6. Python实现常用的数据结构
  7. hdu5556 Land of Farms
  8. JNDI在server.xml中的配置(全局和局部的)
  9. 《用TCP/IP进行网络互连》读书笔记
  10. 【洛谷1640】[SCOI2010]连续攻击游戏