如何在JavaScript递归函数执行结束后清空全局数组变量
实现方法
核心逻辑是区分最外层初始调用和内层递归调用,仅当最外层调用的所有递归流程全部执行完成后,再执行全局数组清空操作,内层递归不触发清空。
另外原代码存在两个隐性bug需要先修复:
firstLevelColor未做变量声明,会泄漏为全局变量- 递归调用时未透传
draggedColumnId参数,会导致内层递归逻辑判断异常
方案1:最小改动实现(保留全局数组)
给函数增加可选的层级标记参数,默认标记当前为顶层调用,递归调用时标记为非顶层,仅顶层调用在所有逻辑执行完成后执行清空:
const arraysList = [] export const changeColorCategories = (array, draggedColumnId, isTopLevel = true) => { // 修复隐式全局变量问题 let firstLevelColor; const isColor = arraysList.length ? arraysList[0][0]?.color : []; if (typeof isColor === 'string') { firstLevelColor = isColor; } const result = array.map((item, index, categories) => { item.color = draggedColumnId !== 3 ? '#010172' : '#000000'; arraysList.push(categories); if (firstLevelColor && !draggedColumnId) { item.color = firstLevelColor; } if (item?.children?.length) { // 递归时标记为非顶层调用,同时透传draggedColumnId修复原逻辑bug changeColorCategories(item.children, draggedColumnId, false); } return item; }) // 仅顶层调用在所有递归执行完成后清空数组,使用length=0保留原数组引用 if (isTopLevel) { arraysList.length = 0; } return result; }
方案2:移除全局变量(更推荐)
全局存储临时状态很容易出现跨调用污染、状态残留的问题,更合理的写法是用闭包把临时数组封装在函数内部,每次顶层调用生成独立的临时数组供递归流程共享,执行完成后临时数组会自动被垃圾回收,不需要手动清空:
export const changeColorCategories = (array, draggedColumnId) => { // 每次调用生成独立的临时数组,递归流程共享该数组 const arraysList = []; let firstLevelColor; // 内部递归逻辑 const traverse = (arr) => { const isColor = arraysList.length ? arraysList[0][0]?.color : []; if (typeof isColor === 'string') { firstLevelColor = isColor; } return arr.map((item, index, categories) => { item.color = draggedColumnId !== 3 ? '#010172' : '#000000'; arraysList.push(categories); if (firstLevelColor && !draggedColumnId) { item.color = firstLevelColor; } if (item?.children?.length) { traverse(item.children); } return item; }) } const result = traverse(array); // 此处所有递归流程已执行完成,可直接使用arraysList中的数据做后续处理 // 函数执行结束后临时数组自动回收,无需手动清空 return result; }
该方案不存在全局状态污染,多次调用函数不会互相干扰,也不需要额外维护清空逻辑,稳定性更高。
内容的提问来源于stack exchange,提问作者Gover123
相关产品推荐
相关产品推荐

