ExtJS出现Maximum call stack错误,该代码片段能否重写?
解决Maximum Call Stack错误的重写方案
首先,这个错误基本是递归调用层级过深或者不小心触发了无限递归导致的。从你给出的代码片段来看,推测原函数里大概率用了递归遍历detailStore来构建detailArray——如果数据量一大,函数调用栈很容易被撑爆,就会出现这个报错。
下面是用迭代思路重写的版本,彻底避开递归调用:
prepareHeaderDetailDataForPost: function(headerdata, detailStore) { var me = this; var detailArray = []; // 用迭代栈替代递归,处理detailStore的遍历逻辑 var processStack = [detailStore]; while (processStack.length > 0) { var currentItem = processStack.pop(); // 这里根据你的实际业务逻辑处理数据,下面是示例逻辑 if (currentItem.hasOwnProperty('children')) { // 如果有子节点,先把子节点压入栈(要保持原有遍历顺序的话,用unshift替代push) Array.prototype.push.apply(processStack, currentItem.children); } else { // 处理单个明细数据,添加到结果数组 detailArray.push({ headerId: headerdata.id, detailId: currentItem.id, // 其他需要的字段,按需补充 content: currentItem.content }); } } // 最后组装header和detail数据返回 return { headerInfo: headerdata, detailList: detailArray }; }
核心优化说明:
- 用while循环+栈数组替代递归,把原本的函数递归调用转化为栈元素的循环处理,彻底避免调用栈溢出
- 如果原函数里的递归是因为不小心重复调用了自身(比如逻辑判断失误导致无限循环调用),一定要检查调用路径,确保没有触发无限循环的分支
- 如果
detailStore存在循环引用的节点,也会导致递归死循环,建议先排查数据结构里的循环引用问题
内容的提问来源于stack exchange,提问作者Sweety
相关产品推荐
相关产品推荐

