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

  • 相关阅读:
    Node开发--->10_Node.js_mongoDB增删改查操作
    Node开发--->9_Node.js_数据库概述及环境搭建
    Node开发--->8_Node.js异步编程
    Node开发--->7_服务器端开发
    Node开发--->6_服务器端开发
    Node开发--->5_nodejs中的模块加载机制
    Node开发--->4_package.json文件
    Node开发--->3_node模块化开发之第三方模块
    Node开发--->2_node模块化开发之系统模块
    2015-7-22 积累的力量
  • 原文地址:https://www.cnblogs.com/ctguwts/p/13161835.html
Copyright © 2020-2023  润新知