JavaScript中的闭包。什么情况下会存在闭包?

  这一段代码没有产生闭包,每次调用f1()的时候都会新开辟内存空间。

function f1(f2) {
        var a = 1;
        function f2() {
            console.log(++a);
        }
         f2();
    }
    f1();
    f1();
    f1();

  因此,输出结果为2,2,2.因为每次f1()执行完毕,存储a变量的内存就会被回收,a变量也就不存在了。当下一次调用f1()的时候,会开辟新内存空间:先把a初始化为1,然后a++,结果为2.

  下面一段代码会产生闭包.

    function f1(f2) {
        var a = 1;
        function f2() {
            console.log(++a);
        }
       return f2;
    }
    var f = f1();
    f();
    f();
    f();

  输出结果是2,3,4. 首先,f1()开辟了一个内存空间,假设这个内存空间的地址是:欣苑2栋312寝室,变量f拿到这个地址。第一次执行f(),a的值变为2.第二次执行f(),不会开辟新的内存空间。因为只有执行f1()的时候,才会开辟新的内存空间。而执行f只是个变量,它存储的是“欣苑2栋312寝室”这个地址。每次执行f()的时候,我们会把“欣苑2栋312寝室”这个地址里的a++,因此结果是2,3,4.

  下面一段代码会产生闭包.

    function HD() {
       var n = 1;
       this.sum = function () {
           console.log(++n);
       };
    }
    var f = new HD();
    f.sum();
    f.sum();
    f.sum();

  输出结果是2,3,4.首先,new HD()开辟一个新的内存空间,假设这个内存空间的地址是:欣苑2栋312寝室,变量f拿到这个地址。第一次执行f.sum(),n的值变为2.第二次执行f.sum(),不会开辟新的内存空间。而是拿到“欣苑2栋312寝室”这个地址下的n变量,并对他加1.

  总结规律:定义函数:function 函数名() { 函数内容 } 。后面每次调用函数,例如:函数名(),都会开辟新的空间。但是,如果把函数地址赋值给一个变量f:var f = new HD(); 我们以后每次调用f()的时候,地址是一样的,因此累加的都是同一个地址的a或者n,不会开辟新的空间。

原文地址:https://www.cnblogs.com/ctguwts/p/13161835.html