首页 > 代码库 > 浅谈对Js闭包的理解

浅谈对Js闭包的理解

理解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这个变量对象,仍然在被引用,所以不会被销毁。