递归函数的全局变量使用技巧

递归函数的全局变量使用技巧

我希望提取以下数组中每个path的值放入一个数组

let arr = [
    {
        path: 'a',
        b: 2,
        children: [
            {
                path: 'b',
                b: 3,
                children: [
                    {
                        path: 'c'
                    },
                    {
                        path: 'd'
                    },
                ]
            }
        ]
    },
    {
        path: 'e',
        b: 2,
    }
]

一、将全局变量直接定义在递归函数的参数中,将不需要在全局额外定义一个全局变量(而且还有副作用)

function fn(arr, result = []) {
    for (const item of arr) {
        result.push(item.path)
        if (item.children) {
            fn(item.children, result)
        }
    }
    return result   // ["a","b","c","d","e"]
}
console.log(fn(arr));

二、如果将这个变量直接定义为全局变量

let result = []
function fn(arr) {
    for (const item of arr) {
        result.push(item.path)
        if (item.children) {
            fn(item.children, result)
        }
    }
    return result   // ["a","b","c","d","e"]
}
console.log(fn(arr));
// 定义的这个全局变量已被修改
console.log(result);   // ["a","b","c","d","e"]
// 必须将全局变量置空
result = []

总结

  1. 为什么这个函数参数可以当做递归函数的全局变量使用,因为递归时,因为对着个参数的引用一直没有变,所以这个参数对函数来说就是全局变量了。
  2. 全局定义变量后还需要手动恢复,另外在全局造成污染。
  3. 从内存和运行速度的角度考虑这两个方法,全局定义变量运行速度肯定快但更占内存,属于用空间来换时间,而函数参数只有在运行到这个函数时才会开辟空间给形参,调用结束时释放空间。
  4. 综上所述,从可读性和封装性维护性考虑,请优先使用函数的参数当做变量使用。
posted @ 2023-01-27 17:26  wanglei1900  阅读(386)  评论(0编辑  收藏  举报