闭包作用域探究小例
今天一位网友问了一个闭包的问题,做了以下实验如下:
<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()的表现是受所在作用域的影响的)