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

  • 相关阅读:
    Parameter Binding in ASP.NET Web API
    Which HTTP methods match up to which CRUD methods?
    ErrorHandling in asp.net web api
    HttpStatusCode
    Autofac Getting Started(默认的构造函数注入)
    Autofac Controlling Scope and Lifetime
    luvit 被忽视的lua 高性能框架(仿nodejs)
    undefined与null的区别
    VsCode中使用Emmet神器快速编写HTML代码
    字符串匹配---KMP算法
  • 原文地址:https://www.cnblogs.com/longze/p/3096527.html
Copyright © 2011-2022 走看看