递归

函数直接或间接调用自身
1:递归需要出口不可没有终止条件 无限递归会导致栈溢出
2:规律
无限i递归与死循环的区别
死循环不会报错,也不会导致栈溢出,会让页面卡住
无限递归会导致栈溢出

  1. 斐波拉数列的第n
  2. 1 1 2 3 5 8 13 21
  3. function fb(n){
  4. if(n == 1 || n ==2){ //递归出口
  5. return 1;
  6. }
  7. console.log(n);
  8. return fb(n-1)+fb(n-2); //规律
  9. }
  10. console.log(fb(7))

尾递归

如果一个函数最后一条语句是调用函数,并且调用函数不是表达式的一部分,则该语句成为尾调用,如果尾调用是调用自身函数,则称为尾递归。
某些语言或执行环境会对尾调用优化,他们会理解销毁当前函数执行环境,避免执行栈空间被占用
在浏览器执行环境中,尾调用没有优化,但在node.js环境中有优化

执行线

任何代码的执行都必须有一个执行环境,执行环境为代码的执行提供支持
执行环境是放到执行栈中的 , 栈中的执行顺序是执行最顶端的被调用的函数
每个函数的调用,都需要创建一个函数的执行环境,函数调用结束,执行环境销毁
执行栈有相对固定的大小,如果执行环境太多,执行栈无法容纳,会导致栈溢出
那上面的递归举例
黄色字体是函数中第一个函数执行环境被销毁后的执行环境.xmind