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被保留了下来(没有被销毁)

原文地址:https://www.cnblogs.com/JDotNet/p/3472016.html