zoukankan      html  css  js  c++  java
  • 闭包作用域探究小例

    今天一位网友问了一个闭包的问题,做了以下实验如下:

    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <title>闭包作用域探究</title>
        </head>
        <body>
    
            <script type="text/javascript">
    
                function a(){
                    var i = 0;
                    return function b(){
                        return ++i;
                    }
                }
                
                var c = a();
                document.write(c()+'<br/>');//1
                document.write(c()+'<br/>');//2
                document.write(c()+'<br/>');//3
    
                var d = a();
                document.write(d()+'<br/>');//1
                document.write(c()+'<br/>');//4
    
            </script>
        </body>
    </html>
    

    很多人把高级语言的垃圾回收机制用到对闭包的解释中,我觉得如果从作用域的概念来理解闭包可能更容易一些,下面是我从作用域角度来解释上面的实验结果:

    1、对于函数(function)我的理解是“你调不调用他都在那里,不离不弃”;

    2、每个函数都是个孩子,每个孩子都有个家(就是函数作用域);

    3、孩子可以用家里的东西(使用所属作用域的变量和函数,就像 i ,当然可以在 i 所在的位置来定义一些函数供这位孩子b来调用);

    4、每家的孩子都只能供这个家来使唤,比如让这孩子叫爸爸(每个作用域,或者每个实体,就像例中的c和d都只能调用自己的b方法);

    5、孩子如果打碎了家里的玻璃,那这家的玻璃就碎掉一块,要是再打一次那就又碎掉一块(每调用一次c的b方法,c的 i 就会改变一次);

    6、家家有本难念的经,但是各念各的经(调用d 的 b方法改变的是d的 i 的值,不会对c 的 i 的值有影响);

    7、每家的孩子在学校都代表这个家庭,但只是代表,除了这个孩子他背后有一个家庭在影响他,孩子的表现很大程度是受家庭环境影响的(当调用 c()时其实是调用a的一个实例(这里就是实例c)的b方法,所以c()的表现是受所在作用域的影响的)

  • 相关阅读:
    XSS之防御与绕过
    说说XXE漏洞那些事
    常见web中间件漏洞(五)weblogic漏洞
    DLL劫持漏洞
    常见web中间件漏洞(四)Tomcat漏洞
    常见web中间件漏洞(三)Nginx漏洞
    CNVD-2021-14536 锐捷 RG-UAC 统一上网行为管理审计系统信息泄露漏洞
    Jupyter安装并设置反向搭理
    读书-刑罚的历史
    读书-反常识
  • 原文地址:https://www.cnblogs.com/longze/p/3096527.html
Copyright © 2011-2022 走看看