上班过程中有没有遇到这种编程需求?
function show(){
var count = 10;
}
show();//执行
上面的代码中,如果我要操纵局部变量count的话,我们应该怎么办??我们没办法,因为当show()执行完毕后,局部变量count就会被回收,我们根本无法获取之。
闭包的产生,就是为我们提供了操纵函数局部变量的方式!是不是很神奇?这在java中是我没有看见过的。
分析:
我们知道,计算机中的内存变量如果有被引用着的话,则系统是不会将之回收的。只要我们能够一直持有这个引用,则就可以令局部变量避免被回收——这是闭包概念成立的前提。
我们改造show函数:
function show(){
var count = 10;
function getCount(){ //声明一个局部函数对象,相当于:
// var getCount = new Function(“console.log(count++);”);
console.log(count++);
}
return getCount; //将函数对象首地址返回。
}
var showCount = show(); // 赋值给showCout
//我们多次调用 showCount()……
showCount(); //打印10
showCount(); //打印11
showCount(); //打印12
showCount(); //打印13
// 由上,从10 ….. 13, 我们可以知道count在show()执行完毕后没有被回收,否则也// 不会每次都递增1.
// 于是我们就将局部变量保留了下来。。。。。。
分析:由于showCount引用了getCount,则getCount不会被回收,因此,getCount内的引用的变量(当然这个变量不是getCount中执行才声明的局部变量)也不会被回收。
不过,这里,注意一点(盲区):
function show(){
var count = 10;
return count ;
}
var x = show();//仅仅是将count的值赋给x,而count已被回收。传值!!
请勿与上面的混淆了!!!!!
网友评论