// 闭包 closure

  1. const fn = () => {
  2. const str = "hello !";
  3. return () => {
  4. console.log(str);
  5. };
  6. };
  7. const fn2 = fn();
  8. fn2();


// fn 2 用到了fn return的函数,在return的函数中,访问了fn的变量str ;
// fn2 所在的作用域 可以访问到fn作用域的变量,并且因为引用了变量,该变量不会销毁了

闭包的概念 可以在B作用域中调用A作用域的函数,并且还可以访问到A作用域的成员

当函数执行完之后,会从栈内存中释放,并且函数中的内部变量也会一起移除

但是当使用闭包之后,堆上面的作用域成员因为被外部引用 所以不能被释放。因此在A作用域中,内部函数还可以访问到外部函数的成员

  1. // closure demo
  2. console.log(Math.pow(4, 2));
  3. console.log(Math.pow(5, 2));
  4. const makePow = (power) => {
  5. return (number) => Math.pow(number, power);
  6. };
  7. // 求平方
  8. const makeTwoPow = makePow(2);
  9. console.log(makeTwoPow(4));
  10. console.log(makeTwoPow(5));
  11. // 求三次方
  12. const makeThreePow = makePow(3);
  13. console.log(makeThreePow(4));
  14. console.log(makeThreePow(5));


  1. // 员工工资fn (基本工资 + 绩效工资) 特点 同级别员工基本工资相同
  2. const getSalary = (level) => {
  3. let baseMoney = 0;
  4. switch (level) {
  5. case 1:
  6. baseMoney = 12000;
  7. break;
  8. case 2:
  9. baseMoney = 15000;
  10. break;
  11. default:
  12. baseMoney = 10000;
  13. }
  14. return (performance) => baseMoney + performance;
  15. };
  16. const getSalary1 = getSalary(1);
  17. const getSalary2 = getSalary(2);
  18. console.log("郑xx", getSalary1(3000));
  19. console.log("李xx", getSalary1(2100));
  20. console.log("王xx", getSalary2(500));
  21. console.log("赵xx", getSalary2(4000));