zoukankan      html  css  js  c++  java
  • JavaScript中闭包的理解

    参考:https://i.cnblogs.com/EditPosts.aspx?postid=3472016&update=1

    闭包:定义在函数内的子函数即为闭包,通过调用该子函数能够从外部读取其父函数的内部变量。

    闭包的两个最大用处:

    1、读取函数的内部变量;

    2、保持其读取的内部变量始终在内存中。

    <script type="text/javascript">
                function f1() {
                    var n = 999;
                    nAdd = function() {
                        alert(n += 1);
                    }
                    //函数f2即为闭包
                    function f2() {
                        alert(n);
                    }
                    return f2;
                }
                var result = f1();
                result();//输出999,通过闭包读取f1函数的内部变量
                nAdd();//输出1000,闭包能保持f1函数的内部变量始终在内存中
            </script>
    原理解读:系统通过result全局变量持有了函数f2的引用,而f2又依赖f1,使得f1的指针引用继续有效,保证f1中的局部变量都有效,不会被垃圾回收机制回收

    加深理解:

    var name = "The Window";

      var object = {
        name : "My Object",

        getNameFunc : function(){
          return function(){
            return this.name;
          };

        }

      };

      alert(object.getNameFunc()());//输出The Window

    原理解读:函数本身也是对象,object.getNameFunc()返回了getNameFunc中的匿名函数引用给当前全局的window对象,故在此匿名函数中的this表示全局window对象

    ///////////////////

    var name = "The Window";

      var object = {
        name : "My Object",

        getNameFunc : function(){
          var that = this;
          return function(){
            return that.name;
          };

        }

      };

      alert(object.getNameFunc()());//输出My Object

    原理解读:var that = this;该语句将object对象引用交给局部变量that,getNameFunc中匿名函数使得在getNameFunc外部that被保留了下来(没有被销毁)

  • 相关阅读:
    2012年的结束
    学习嵌入式的点滴(一)
    面试的点滴(一)
    学习嵌入式的点滴(二)
    DB2 SQL脚本批量执行(转)
    联邦数据库的一个例子(转)
    在 DB2 9.7 for Linux, UNIX, and Windows 上运行 Oracle 应用程序(转)
    WINDOWS批处理命令详解(转)
    SQL1159 Initialization error with DB2 .NET Data Provider, reason code 2;reason code 10
    Oracle Package中的包变量的使用(转)
  • 原文地址:https://www.cnblogs.com/JDotNet/p/3472016.html
Copyright © 2011-2022 走看看