下面先看一个例子,在不运行的情况下推测一下返回结果.
function t1(){
var age = 20;
function t2(){
alert(age);
}
return t2;
}
var temp = t1();
var age = 99;
temp();在学习了作用域之后也许会分析结果是99,实际上是20.
下面对其一一分析:
在大部分语言中,t1被调用执行,则申请内存并把其局部变量push入栈。t1函数执行完毕,内部的局部变量随着函数退出而销毁。因此age=20的局部变量已经消失了。但是在js中,age=20这个变量,却被t2捕捉,即使t1执行完毕,通过t2依然能访问该变量。在js中,t1执行过程中,又生成t2,而从作用域上来说,t2能访问到age=20,于是age=20没有消失,而是与返回的t2函数形成了一个“环境包”,这个包属于t2,所以叫闭包。这种情况下,返回的函数并非孤立的函数,甚至把周围的变量环境,形成了一封闭的“环境包”共同返回,所以叫闭包。
一句话概括,函数的作用域取决于声明时,而不取决与调用时。
例如如果在多人开发的程序中需要一个计数器,我们就可以用闭包实现。
var cnt =( function(){
var count = 0;
return function(){
return ++count;
}
}());
alert(cnt());
alert(cnt());
alert(cnt());
240

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



