You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法在函数调用中使用自减(--)简写语法递减数值?附幂函数示例

为什么不能在函数调用参数中使用自减(--)简写语法?

咱们先看你写的递归计算幂的代码:

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的递减是在这个函数调用完成之后才发生的。

举个具体的流程:

  1. 第一次调用power(2,4),exponent是4,不等于0,进入递归
  2. 调用power(2, 4)(因为exponent--先返回4,之后才把exponent改成3)
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:49:31