如何解决js递归里面出现的堆栈溢出
2024-08-21 03:41:26
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
。因此,该方法从头到尾都没有直接的递归调用,所以无论迭代次数的多少,调用堆栈保持清空的状态。
最新文章
- STM32_RTC君
- CSS3图片缩放
- 关于Scala JDK与IDEA版本兼容的问题
- 【转】asp.net c# 网上搜集面试题目大全(附答案)
- HDU 4888 Redraw Beautiful Drawings(最大流+判最大流网络是否唯一)
- win7下制作ubuntu系统安装启动盘和U盘安装ubuntu全过程
- mysql学习笔记之基础篇
- redis常见错误
- oracle图形界面乱码
- .Net 官方学习文档
- php获取二维数组中某一列的值集合
- 关于HTML使用ComDlg ActiveX 无法弹出相应对话框的问题1
- [Swift]LeetCode942. 增减字符串匹配 | DI String Match
- Petrozavodsk Winter-2018. Carnegie Mellon U Contest
- configure,make,make install作用和关系的一些理解
- spring boot 常见的配置问题
- WEBSERVICE-AXIS2服务端代码
- 各种hash函数
- 站点默认访问https
- jQuery对象扩展方法(Extend)深度解析
热门文章
- WebService之CXF注解之三(Service接口实现类)
- ORA-00922:选项缺失或无效
- 常用javascript表单验证方法
- C# md5加密方法
- TypeError: Error #1034: 强制转换类型失败:无法将 ";"; 转换为 Array。
- Python实现常用的数据结构
- hdu5556 Land of Farms
- JNDI在server.xml中的配置(全局和局部的)
- 《用TCP/IP进行网络互连》读书笔记
- 【洛谷1640】[SCOI2010]连续攻击游戏