递归

函数直接或间接调用自身

避免无限调用递归,无限递归会导致执行栈溢出。

对比无限循环

  • 无限循环不会报错,也不会导致栈溢出
  • 无限递归会导致栈溢出

执行栈

任何代码的执行都必须有一个执行环境,执行环境为代码的运行提供支持。

执行环境是放到执行栈中的。

每个函数的调用,都需要创建一个函数的执行环境,函数调用结束,执行环境销毁。

执行栈有相对固定的大小,如果执行环境过多,执行栈无法容纳,会报错Uncaught RangeError: Maximum call stack size exceeded

尾递归

如果一个函数最后一条语句是调用函数,并且调用函数不是表达式的一部分,则该语句称为尾调用; 如果尾调用是调用自身函数,则称为尾递归。

某些语言或执行环境,会对尾调用进行优化,它们会立即销毁当前函数,避免执行栈空间被占用。

在浏览器执行环境中,尾调用没有被优化,但在 nodejs 环境中有优化。