javascript中的闭包

JavaScript闭包详解
本文介绍了JavaScript中的闭包概念,包括其定义、作用及如何在函数中使用闭包来访问和维护变量。通过实例展示了闭包的基本用法及其在内存管理中的特点。

了解闭包前,需要对JavaScript的变量作用域有一定的了解,请参考文章:

http://www.cnblogs.com/rainman/archive/2009/04/28/1445687.html#1865103
http://blog.youkuaiyun.com/hzrui/archive/2009/02/27/3941137.aspx
一、闭包的定义
官方定义:

闭包是可以包含自由(未绑定)变量的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。

上面提到的“代码块”,在实际应用中通常会是一个函数。
下面看一个简单的例子1:

var message = "hello world";
function sayHelloWorld(){
    alert(message);
}
sayHelloWorld();//运行结果为:"hello world"
例1中, message并未在函数sayHelloWorld中定义,而在其外部定义,即在闭包官方定义中的“定义代码块中的环境”定义。
常用的形式是在一个函数中定义另一个函数,例2:
var count=10;
var f1 = function(num1,num2){
    function f2(){
      return count+num1+num2;
      }
    return f2();
};
alert(f1(1,2));//运行结果为:13

例2中,f2作为f1的内部函数,并未接受参数,函数执行是需要的值是从执行环境中获取的。f2无疑是闭包
二、闭包的作用
1.在函数外部访问函数的局部变量。例3;

 

function f1(){
 var i=100;
 function f2(){
   return ++i;
 }
 return f2;
}
var result =f1();
alert(result());//结果为101

 

在例3中利用闭包在函数f1外部访问了,局部变量i的值。注意:如果定义变量时不加var关键字,则此变量为全局变量,全部变量均为window对象的属性[/b]
2.在内存中维持变量。
将例3稍作修改,例4:

 

function f1(){
 var i=100;
 rel = function(){i+=1};
 function f2(){
   return ++i;
 }
 return f2;
}
var result =f1();
alert(result());//结果101
rel();
alert(result())//结果103



例4中,f1的局部变量i在第一次调用f1后并未被回收,而是一直驻留内存,这是由于f2被赋给了全局变量result,而f2依赖于f1,所以在使用时f1和f2都是驻留在内存中的
三、总结
javascript的很多高级应用都要用到闭包,但是使用闭包时要格外小心,不恰当的使用会导致内存泄露,在设计时要保证退出函数时销毁全部不再使用的局部变量。
参考资料:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值