标签:style blog class code java color
理解Js的闭包,首先让我们先看几个概念
执行环境(executive environment)每个函数都有自己的执行环境,匿名函数默认为全局环境。
作用域链(scope chain)子函数继承父函数,但是父函数不能引用子函数。
变量对象(variable object)分为全局变量对象,和局部变量对象,前者的生存在整个环境中,后者在生存在函数的执行环境下,就是说,执行函数时被创建,当函数执行完后被销毁。
怎么被销毁的啊?目前最常见的算法是当变量对象不再被引用时,便可回收内存。
但是,若是想在函数外部访问函数内部的变量,就要用的闭包。
例如下面的程序:
| 
       1 
      2 
      3 
      4 
      5 
      6 
      7 
      8 
      9 
      10 
      11 
      12 
      13 
      14  | 
    
      var 
cat = "Hello Kitty";function 
findCat(){    var 
cat = "Garfield"    var 
dog = "Odie"    return 
function(){        return 
alert(cat);    }}var 
myCat = findCat();myCat();//Garfield | 
我们在函数外部访问到了,函数里面的变量“Garfield”
匿名函数为findCat()内部函数,继承其作用域链,能够找到变量cat。
作用域链:(优先级从0开始)
| 
       2 全局环境  | 
    
       变量对象: cat = “Hello Kitty”  | 
| 
       1 findCat()环境  | 
    
       变量对象:cat = “Garfield”  | 
| 
       0 匿名函数  | 
    
       变量对象:无  | 
变量对象不是在函数findCat执行完就已经被敲毁了嘛?
但是,我们在执行完findCat后,只是销毁了作用域链,(作用域链就是一个指向变量对象的指针),当活动对象被引用的次数为0就会被销毁,但是不要忘了,我们的匿名函数继承了父函数的作用域链,在闭包中,cat这个变量对象,仍然在被引用,所以不会被销毁。
标签:style blog class code java color
原文地址:http://www.cnblogs.com/chrysalis-china/p/3712688.html