• 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,不会开辟新的空间。

  • 相关阅读:
    cogs 1682. [HAOI2014]贴海报 WW
    cogs 2039. 树的统计
    cogs luogu [NOIP2011] 选择客栈
    cogs luogu 1804. [NOIP2014]联合权值 WD
    cogs luogu [NOIP2014]生活大爆炸版石头剪刀布
    leetcode[119]Pascal's Triangle II
    leetcode[120]Triangle
    leetcode[121]Best Time to Buy and Sell Stock
    leetcode[122]Best Time to Buy and Sell Stock II
    leetcode[123]Best Time to Buy and Sell Stock III
  • 原文地址:https://www.cnblogs.com/ctguwts/p/13161835.html
Copyright © 2020-2023  润新知