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()的表现是受所在作用域的影响的)

  • 相关阅读:
    Ansible快速实战指南----多机自动化执行命令、部署神器
    linux 挂载共享盘
    蓄水池抽样算法
    PCA MATLAB代码
    网口转串口
    通过Python收集MySQL MHA 部署及运行状态信息的功能实现
    Linux常用命令总结(二)
    python 学习笔记 (四)
    MySQL 学习笔记(四)
    学习ProxySQL参考到几个网址
  • 原文地址:https://www.cnblogs.com/longze/p/3096527.html
Copyright © 2011-2022 走看看