首页 > Web开发 > 详细

浅谈对Js闭包的理解

时间:2014-05-07 17:32:17      阅读:534      评论:0      收藏:0      [点我收藏+]

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

浅谈对Js闭包的理解,布布扣,bubuko.com

浅谈对Js闭包的理解

原文:http://www.cnblogs.com/chrysalis-china/p/3712688.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!