闭包作用域探究小例

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

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

 

 

posted @ 2013-05-24 11:51  龙则  阅读(208)  评论(0编辑  收藏  举报