zoukankan      html  css  js  c++  java
  • 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,不会开辟新的空间。

  • 相关阅读:
    Python split()方法分割字符串
    Python创建线程
    Python find()方法
    webpack中‘vant’全局引入和按需引入【vue-cli】
    webpack中‘mint-ui’全局引入和按需引入【vue-cli】
    nginx中 处理post方式打开页面的报错405
    nginx中 vue路由去掉#后的配置问题
    webpack中 VUE使用搜狐ip库查询设备ip地址
    webpack中 VUE使用百度地图获取地理位置
    VUE动态设置网页head中的title
  • 原文地址:https://www.cnblogs.com/ctguwts/p/13161835.html
Copyright © 2011-2022 走看看