递归函数的全局变量使用技巧
我希望提取以下数组中每个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 = []
总结
- 为什么这个函数参数可以当做递归函数的全局变量使用,因为递归时,因为对着个参数的引用一直没有变,所以这个参数对函数来说就是全局变量了。
- 全局定义变量后还需要手动恢复,另外在全局造成污染。
- 从内存和运行速度的角度考虑这两个方法,全局定义变量运行速度肯定快但更占内存,属于用空间来换时间,而函数参数只有在运行到这个函数时才会开辟空间给形参,调用结束时释放空间。
- 综上所述,从可读性和封装性维护性考虑,请优先使用函数的参数当做变量使用。