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

  • 相关阅读:
    luogu P4342 [IOI1998]Polygon
    luogu P2051 [AHOI2009]中国象棋
    luogu P3304 [SDOI2013]直径
    luogu P1776 宝物筛选_NOI导刊2010提高(02)
    luogu P2900 [USACO08MAR]土地征用Land Acquisition
    CF1009E [Intercity Travelling]
    luogu P4360 [CEOI2004]锯木厂选址
    luogu P1268 树的重量
    centos7扩展根分区
    tcpdump抓包工具的使用
  • 原文地址:https://www.cnblogs.com/JDotNet/p/3472016.html
Copyright © 2011-2022 走看看