为何无法在函数调用中使用自减(--)简写语法递减数值?附幂函数示例
为什么不能在函数调用参数中使用自减(
--)简写语法? 咱们先看你写的递归计算幂的代码:
function power(base, exponent) { // base case if (exponent === 0) { return 1; } return base * power(base, exponent--); } console.log(power(2, 4)); // 你预期是16,但实际会直接栈溢出
问题出在哪?后自减运算符的执行顺序
JavaScript里的exponent--是后自减运算符,它的执行逻辑很关键:
- 先把变量当前的原始值作为返回值
- 等这个返回值被用掉之后,再把变量本身的值减1
放到你的递归调用里看:当你写power(base, exponent--)时,传给下一层递归的参数是还没减1的exponent值,而exponent的递减是在这个函数调用完成之后才发生的。
举个具体的流程:
- 第一次调用
power(2,4),exponent是4,不等于0,进入递归 - 调用
power(2, 4)(因为exponent--先返回4,之后才把exponent改成3) - 新的递归层里exponent还是4,又会重复调用
power(2,4),无限套娃直到浏览器抛出栈溢出错误
怎么改才能得到正确结果?
有两种靠谱的写法:
- 用前自减运算符(
--exponent):它会先把变量减1,再返回新的值,这样传给递归的就是递减后的数值
function power(base, exponent) { if (exponent === 0) { return 1; } return base * power(base, --exponent); }
- 直接传递
exponent - 1:这种写法没有修改原变量的副作用,代码更清晰,也不容易踩运算符顺序的坑,我个人更推荐这种
function power(base, exponent) { if (exponent === 0) { return 1; } return base * power(base, exponent - 1); }
一句话总结
后自增/自减运算符在函数参数里使用时,传递的是变量的原始值,而不是修改后的值——这会让递归永远达不到base case(比如你的例子里exponent永远不会变成0)。如果要传递递减后的值,要么用前自减,要么直接写变量-1,后者更安全易懂。
内容的提问来源于stack exchange,提问作者user3562836
相关产品推荐
相关产品推荐

