You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:09:31