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

被折叠的 条评论
为什么被折叠?



