js闭包的必要条件及创建和消失

94 阅读1分钟

创建闭包的必要条件:

                1.函数嵌套

                2.内部函数引用外部函数的变量

                3.将内部函数作为返回值返回

 

闭包是什么?

就是可以访问外部函数(作用域)中变量的内部函数

 闭包是什么时候产生的?

                    - 当调用外部函数时,闭包就已经创建了

                    - 外部函数每调用一次就会产生一个闭包,

                        闭包和闭包之间是相互独立的

闭包是怎么消失的?

                    - 直到内部函数被GC(垃圾回收)后才消失

function outer() {
      var n = 0;
      function inner() {
        n++;
        console.log('inner ->',n);
      }
      function inner2() {
        n++;
        console.log('inner2 ->',n)
      }
      // 将内部函数存储到一个对象中返回
      return {inner:inner,inner2:inner2};
    }
    var obj = outer();
    var obj2 = outer();
    console.log(obj); // 打印的是 {inner: ƒ inner(), inner2: ƒ inner2()}
    obj.inner();// 初次n++ 打印的是1
    obj.inner2();// 二次n++ 因为改变的是同一个变量 打印的是2

    // obj2是单独的函数调用,所以产生的闭包和obj之间是独立
    obj2.inner();// 初次n++ 打印的还是1
    obj2.inner2();// 二次n++ 因为改变的和obj2.inner()改变的是同一个变量 打印的是2
    
    console.log('outer',outer); // 打印的是 'outer',f outer(){}...
    var outer = null // 闭包消失
    console.log('outer',outer); // 打印的是 'outer',null

看下控制台打印结果:

image.png