闭包:让函数内的变量,可以让外部访问和修改。即从外部读取局部变量
实例一:
var person = function () { var name = 'zhangsan'; return { getName : function () { alert(name); }, setName : function (newName) { name = newName; } } }();
使用:
person.getName(); //结果:name='zhangsan'
person.setName('wangwu'); //设置属性值
person.getName();//结果:name='wangwu' 属性值变了
为什么匿名函数执行完毕,name变量没被回收?
原因就在于匿名函数是getName和setName的父函数,而getName和setName调用了匿名函数name变量,而getName和setName的存在依赖于匿名函数name变量,表示匿名函数name变量还在用所以不会被回收。 因此匿名函数也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
实例二
//每次执行一次c()i加1。关键在于var
c=a();c容器将i装载记住了。
function
a(){
var
i=0;
function
b(){
alert(++i);
}
return
b;
}
var
c=a();
c();
实例三
function a(){
var i =0;
function b(){
var i =0; //为什么把这句注释掉,执行a()时i是undefined? 答:执行b()函数,函数体i = i+1语句,所以i要先声明在使用。
i = i+1;
alert(i);
}
return b();
}
a();