首页 > 代码库 > 浅谈对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这个变量对象,仍然在被引用,所以不会被销毁。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。