疑问: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 - 开始回溯计算:
power(2,1)拿到返回值1,计算2*1=2,返回2power(2,2)拿到返回值2,计算2*2=4,返回4power(2,3)拿到返回值4,计算2*4=8,返回8
- 最终
console.log输出8
补充:函数表达式的区别
如果是用函数表达式定义(比如const power = function(base, exponent) {}),那确实会出现调用时函数未定义的错误——因为变量提升只会提升power这个变量的声明,不会提升后续的函数赋值。但你写的是标准的函数声明,所以不存在这个问题。
内容的提问来源于stack exchange,提问作者JB999
相关产品推荐
相关产品推荐

