闭包这个概念 我们先来看一下它的定义吧
[b]闭包的准确定义[/b]:代码和代码的作用域构成的综合体。
[b]定义不理解没关系, 上来一段代码在说。[/b]
再看代码列子:
function test(a,b){
var name='j2eedengzhangtao';
function test2(){
var myarg=name;
var myarg2=myarg;
}
return test2;
}
var test3=test(1,2);
test3();
其实闭包就是一個函数 在列子中 test2就是一個闭包了, 为什么说他是闭包, 因为test2中引用了外部函数的变量 ,即引用了test2的外部作用域 ,然后test函数返回了test2 这里 test函数执行完了,按理说 name变量要释放了, 但是 没有! 保存到了test2的作用域。
在总结一下: 闭包函数的上下文环境当中保存了外部函数的参数、局部变量等信息,所以在外部函数执行完毕之后这些属性值并不会被释放掉。??何时才释放呢?当闭包函数自身也不被任何对象所引用的时候才释放。
[b]再来一段 更加深度一点的列子:[/b]
var Rectangle=function(width,height){
this.getWidth=function(){return width};
this.getHeight=function(){return height};
}
Rectangle.prototype.area=function(){
return this.getWidth()*this.getHeight();
}
var rectangle= new Rectangle(12,2);// 在 new的时候 12, 和2 还没被释放。
注意 rectangle没 有width和height的属性 ,对值12 ,2 没办法储存。但是因为
形参了闭包 被存在了 他上一级的作用域
alert(rectangle.area());//输出24 现在释放了
现在理解了 闭包吧 ,最简单的就是最少得两个function ,然后要满足 内部待用了外部函数, 内部函数又被用到了,使得外部函数的东西没被释放 存储在内部函数的作用域里
[b]在补充一句[/b] 在 IE 中,使用闭包,可能会造成内存泄露,不知道现在版本的 IE 浏览器中是否解决了此问题
[b]闭包的准确定义[/b]:代码和代码的作用域构成的综合体。
[b]定义不理解没关系, 上来一段代码在说。[/b]
再看代码列子:
function test(a,b){
var name='j2eedengzhangtao';
function test2(){
var myarg=name;
var myarg2=myarg;
}
return test2;
}
var test3=test(1,2);
test3();
其实闭包就是一個函数 在列子中 test2就是一個闭包了, 为什么说他是闭包, 因为test2中引用了外部函数的变量 ,即引用了test2的外部作用域 ,然后test函数返回了test2 这里 test函数执行完了,按理说 name变量要释放了, 但是 没有! 保存到了test2的作用域。
在总结一下: 闭包函数的上下文环境当中保存了外部函数的参数、局部变量等信息,所以在外部函数执行完毕之后这些属性值并不会被释放掉。??何时才释放呢?当闭包函数自身也不被任何对象所引用的时候才释放。
[b]再来一段 更加深度一点的列子:[/b]
var Rectangle=function(width,height){
this.getWidth=function(){return width};
this.getHeight=function(){return height};
}
Rectangle.prototype.area=function(){
return this.getWidth()*this.getHeight();
}
var rectangle= new Rectangle(12,2);// 在 new的时候 12, 和2 还没被释放。
注意 rectangle没 有width和height的属性 ,对值12 ,2 没办法储存。但是因为
形参了闭包 被存在了 他上一级的作用域
alert(rectangle.area());//输出24 现在释放了
现在理解了 闭包吧 ,最简单的就是最少得两个function ,然后要满足 内部待用了外部函数, 内部函数又被用到了,使得外部函数的东西没被释放 存储在内部函数的作用域里
[b]在补充一句[/b] 在 IE 中,使用闭包,可能会造成内存泄露,不知道现在版本的 IE 浏览器中是否解决了此问题