闭包的含义 :函数本身就是闭包, 函数可以记住自已定义时所处的外部环境 , 和内部语句, 这就是闭包

案列1

  1. //
  2. function outer() {
  3. var a = 10;
  4. function inner() {
  5. console.log(a);
  6. }
  7. //inner 没有小括号 , 表示定义语句
  8. return inner;
  9. }
  10. var i = outer(); i();//结果 10

案列2

  1. function outer() {
  2. var a = 10;
  3. function inner() {
  4. console.log(a);
  5. }
  6. return inner();
  7. }
  8. outer();//结果 10

闭包是函数天数天生存在的性质 , 不需要任何结构, 只不过我们需要借助这种形式体会到闭包.

  1. <script>
  2. //形参 是局部变量
  3. function outer(x) {
  4. function inner(y) {
  5. //当前作用域没有X的定义, 使用outer中 X
  6. console.log(x + y);
  7. }
  8. //返回inner 定义
  9. return inner;
  10. }
  11. //将outer 调用赋值给i , 相当于将inner 定义赋值的i
  12. //类是于把inner拿到外部使用, 能够记住自已定义时所处的外部环境x=10
  13. //类是于把inner拿到外部使用, 能够记住自已定义时所处的内部环境console.log(x + y)
  14. // I = function inner(y) { console.log(10+ y);}
  15. var i = outer(10);
  16. i(20, 30, 40);
  17. // console.log(i);
  18. //声明一次函数 I 可以多次调用
  19. i(100);
  20. </script>

2

  1. <script>
  2. //闭包: 函数能够记住定义的外部环境和内部语句
  3. function outer(x, y) {
  4. function inner(y) {
  5. // 作用域链 根据就近原则
  6. console.log(y);
  7. console.log(x + y);
  8. }
  9. //调用outer(x,y) 返回的事inner 函数
  10. return inner;
  11. }
  12. //i赋值的事inner 函数
  13. //outer(1,2) X=1 , y=2
  14. var i = outer(1,2);
  15. //i是inner函数名字 ,调用i函数 i的实际参数是赋值给inner 函数 y
  16. //i(10) 调用, 能够记住x=1 , 还可以内部语句console.log(1+y)
  17. i(10);
  18. i(20);
  19. </script>

image.png

闭包并不是一成不变的, 函数的每一次调用,都会产生全新的闭包,

  1. <script>
  2. //闭包: 函数能够记住定义的外部环境和内部语句
  3. function fun1() {
  4. var a = 10;
  5. function fun2() {
  6. a++;
  7. console.log(a);
  8. }
  9. //调用fun1 返回的事fun2的定义
  10. return fun2;
  11. }
  12. //每一次fun1调用都产生一个全新的闭包, 之间互不影响
  13. var inn1 = fun1();
  14. var inn2 = fun1();
  15. //闭包 的外部环境不是一成不变的 能够记住当前的新值 ,并且参与计算
  16. inn1();
  17. inn1();
  18. inn1();
  19. //每一次fun1 调用都产生全新的闭包,inn1 和inn2 闭包互不影响
  20. //每一个闭包,外部环境时全新的内部语句也是全新的
  21. inn2();
  22. inn2();
  23. inn1();
  24. </script>

image.png