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

  • 相关阅读:
    php 计算两点地理坐标的距离
    objective-c中#import和@class的差别
    我与小娜(07):量子通信的奥
    OpenStack部署到Hadoop的四种方案
    iOS UI13_数据解析XML_,JSON
    Redis集群
    《AndroidStudio有用指南》反馈问题和建议
    numpy函数库中一些经常使用函数的记录
    1015 history grep |mysql
    php 生成压缩文件
  • 原文地址:https://www.cnblogs.com/ctguwts/p/13161835.html
Copyright © 2011-2022 走看看