javascript闭包

官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包的特点:
  1.作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
  2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
  简单的说,javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
function closure(){
var str = "I'm a part variable.";
return function(){
alert(str);
}
}
var fObj = closure();
fObj();
在上面代码中,str是定义在函数closure中局部变量,若str在closure函数调用完成以后不能再被访问,则在函数执行完成后str将被释放。但是由于函数closure返回了一个内部函数,且这个返回的函数引用了str变量,导致了str可能会在closure函数执行完成以后还会被引用,所以str所占用的资源不会被回收。这样closure就形成了一个闭包。

Closure中文翻译为闭包.字面上来理解就是"封闭的包".(这是一句废话)
闭包是什么?
书面解释为: 所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
我认为闭包就是能够读/写函数内部的某些变量的子函数,并将这些变量保存在内存中.

闭包的作用
上面的概念中已经提到过,主要就是为了读/写函数内部的某些变量,并将它保持在内存中.可能这样讲未必这么容易理解,下面让我们来看一些例子:
1,读取警察的生命值

 1 function PoliceMan() {
 2     //定义初始生命值
 3     var lifeEnergy = 100;
 4     //显示当前生命值
 5     function showLifeEnergy() {
 6         alert(lifeEnergy);
 7     }
 8     return showLifeEnergy;
 9 }
10 
11 //创建一个警察
12 var pm = new PoliceMan();
13 //显示当前生命值
14 pm();

2,读写/保存 警察的生命值

 

 1 function PoliceMan() {
 2     //定义初始生命值
 3     var lifeEnergy = 100;
 4     //中弹减少生命值
 5     InBullet = function(){
 6         lifeEnergy -= 1;
 7     }
 8     //显示当前生命值
 9     function showLifeEnergy() {
10         alert(lifeEnergy);
11     }
12     return showLifeEnergy;
13 }
14 
15 //创建一个警察
16 var pm = new PoliceMan();
17 //显示当前生命值
18 pm();
19 //中弹减少生命值
20 InBullet();
21 //显示当前生命值
22 pm();


 

 注意事项
由以上例子我们可以看到警察的生命值变量lifeEnergy会一直驻留在内存当中.如果这种方法使用频繁,那么很容易就把机器的内存消耗完.因此建议能用函数的地方就尽量使用函数,而不要使用闭包.

作者:肥占
出处:http://extjs.org.cn 
posted @ 2013-08-16 12:16  City_Hunter_XYZ  阅读(216)  评论(0)    收藏  举报