JavaScript如何处理未知值?递归函数中current与history取值疑问
关于递归函数中current/history参数的疑问解答
嘿,我刚看到你的问题,作为一个天天和JS递归打交道的开发者,我来帮你把这个点掰明白~
首先明确说:这不是变量提升(hoisting)的作用,而是ES6函数默认参数的特性!你看的那个递归示例,作者肯定在函数定义的时候,给current和history设置了默认值,只是你可能没留意到细节。比如这类递归函数的常见写法是这样的:
// 函数定义时给current和history加了默认值 function findTargetPath(target, current = 0, history = []) { // 第一个if分支:判断当前值是否命中目标 if (current === target) { return `找到路径:${history.join(' -> ')} -> ${current}`; } // 第二个if分支:当前值超过目标,终止递归 if (current > target) { return '没有可行路径'; } // 第三个if分支:继续递归,更新current和history if (current < target) { return findTargetPath(target, current + 2, [...history, current]); } } // 外层调用只传target参数就行 console.log(findTargetPath(10));
你看,当你调用外层函数只传target时,JS会自动用函数定义里给current和history设置的默认值(这里是0和空数组[]),完全不需要手动传这俩参数——这就是为啥三个if分支里能直接用current的值。
再说说你问的「JavaScript如何处理未知值」
这里的“未知值”其实就是未传入的函数参数:
- 如果函数参数没有设置默认值,JS会把未传入的参数设为
undefined。比如:function test(a) { console.log(a); // 输出 undefined } test(); // 没传a参数 - 但如果像你看的那个递归示例一样,给参数加了默认值,那JS就会用默认值替代
undefined,保证函数逻辑能正常跑起来。
最后区分下变量提升和默认参数
变量提升是指var声明的变量会被提升到当前作用域的顶部(但赋值不会),比如:
console.log(x); // 输出 undefined(因为var x被提升了,但赋值没提升) var x = 10;
这和你遇到的递归参数问题完全是两回事,别搞混啦~
内容的提问来源于stack exchange,提问作者localhost
相关产品推荐
相关产品推荐

