这种展平算法如何不忘记变量?

How does this flatten algorithm not forget the variable?

我正在弄乱一个数组,最后我写了这样的东西

const arr = [1,[[4,5],4,[9,8]]];

const result = [];
const flatten = arr =>
{

    arr.forEach(elem =>{
        if(Array.isArray(elem))
        {
            flatten(elem);
        }
        else{
            result.push(elem);
        }
    })
    return result;
}


console.log(flatten(arr))

然后我用谷歌搜索了解决方案,我找到了一个看起来更像这样的解决方案。

const arr = [1,[[4,5],4,[9,8]]];


const flatten = arr =>
{
    let result = [];
    arr.forEach(elem =>{
        if(Array.isArray(elem))
        {
            result = result.concat(flatten(elem));
        }
        else{
            result.push(elem);
        }
    })
    return result;
}


console.log(flatten(arr))

如你所见,result变量在函数中,但是函数是递归的,它是如何保存的?谢谢。

尝试 运行 此代码并按照日志进行操作。您将了解递归的工作原理。

const arr = [1,[[4,5],4,[9,8]]];


(flatten = arr =>
{
    let result = [];
    console.log(`initialized result for element ${arr} ${result}`)
    arr.forEach(elem =>{
        if(elem.length)
        {   console.log(`updating result if we get an array ${result.length}`)
            result = result.concat(flatten(elem));
            console.log(`result updated in case of array ${result}`)
        }
        else{
            console.log(`updating result if we get a number ${result.length}`)
            result.push(elem);
            console.log(`result updated in case of number ${result}`)
        }
    })
    return result;
})(arr)