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

疑问:JavaScript递归函数power内部为何能调用未定义的自身?

关于JavaScript递归函数power的执行逻辑解答

你的核心误解在于对JavaScript函数声明时机的认知——函数声明会被JS引擎自动提升到当前作用域的顶部,所以当函数内部调用自身时,整个power函数的定义已经被提前注册完成,完全不存在“尚未完成定义”的情况。

为什么递归调用能正常执行?

JS引擎在执行代码前会先完成预编译步骤:扫描当前作用域内的所有函数声明,将它们的定义提前加载到作用域中。也就是说,当power函数内部执行到return base * power(base, exponent -1)这行代码时,power函数已经是一个完全可用的函数了。

拆解power(2, 3)的完整执行流程

我们一步步看递归的展开与回溯过程:

  • 调用power(2, 3):exponent=3≠0,进入else分支,需要计算2 * power(2, 2)
  • 调用power(2, 2):exponent=2≠0,进入else分支,需要计算2 * power(2, 1)
  • 调用power(2, 1):exponent=1≠0,进入else分支,需要计算2 * power(2, 0)
  • 调用power(2, 0):exponent=0,触发if条件,直接返回1
  • 开始回溯计算:
    1. power(2,1)拿到返回值1,计算2*1=2,返回2
    2. power(2,2)拿到返回值2,计算2*2=4,返回4
    3. power(2,3)拿到返回值4,计算2*4=8,返回8
  • 最终console.log输出8

补充:函数表达式的区别

如果是用函数表达式定义(比如const power = function(base, exponent) {}),那确实会出现调用时函数未定义的错误——因为变量提升只会提升power这个变量的声明,不会提升后续的函数赋值。但你写的是标准的函数声明,所以不存在这个问题。

内容的提问来源于stack exchange,提问作者JB999

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:05:24