闭包、递归和回调

闭包

  • 涉及变量作用域

  • 内部函数使用外部函数变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

function outerFunc() {
  const outerVal = 100;

  function interFunc() {
    console.log(outerVal);
  }

  return interFunc; // 记得返回你的内部函数
}

const inter = outerFunc();
inter(); //100

递归

  • 自己调用自己,一般用于 给定条件 过滤/计算 数据

  • 著名案例 斐波那契数列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

function fibonacciRecursive(n) {
  if (n < 2) {
    return n;
  }
  return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
}

fibonacciRecursive(8);
// 21

回调

  • !!!JavaScript 默认是同步的,并且是单线程的。这意味着代码不能创建新线程并行运行。!!!

  • 函数调用另一个函数

  • func_1 作为 func_2参数func_2(func_1)

#. 同步回调(立即执行)

  • 最佳案例 Array.prototype.map()
1
2
3
4
5

const nums = [1, 2, 3];
const printDouble = (n) => console.log(2 * n); // 双倍打印

nums.map(printDouble);

#. 异步回调(等待执行)

  • 最佳案例 Promise.prototype.then()
1
2
3
4
5

const nums = fetch("https://api.nums.org"); // [1, 2, 3]
const printDouble = (n) => console.log(2 * n); // 双倍打印

nums.then(printDouble); // 2, 4, 6

#. 回调地狱

如果调用嵌套增加,代码层次会变得很深,维护难度也随之增加,尤其是包含了很多循环和条件等。

嵌套调用的“金字塔”随着每个异步行为会向右增长。很快它就失控了。

幸运的是,有其他方法可以避免此类金字塔。最好的方法之一就是 promise