闭包
functiom a(){
//形成闭包
function b(){
var bbb = 234;
console.log(aaa);//123
}
var aaa = 123;
return b;
}
var glob = 100;
var demo = a();
demo();
function a(){
var num = 100;
function b(){
num++;
console.log(num);
}
return b;
}
var demo = a();
demo();
demo();
//101 //102
//function b()形成闭包,执行完一次bAO被销毁,但是num的值存在aAO中,按照先从自身调用的原则,第二次执行demo中的function b时,调用bAO中的num = 101再++。
当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。
- 闭包的作用
- 实现公有变量
e.g.: 函数累加器
function test(){
var num = 100;
function a(){
num++;
console.log(num);//101
}
function b(){
num--;
console.log(num);//100
}
return [a,b];
}
var myArr = test();
myArr[0]();
myArr[1]();
//101 100
- 可以做缓存(存储结构)
e.g.: eater
function eater(){
var food = "";
var obj = {
eat : function(){
console.log("i am eating " + food);
food = "";
},
push : function(myFood){
food = myFood;
}
}
return obj;
}
var eater1 = eater();
eater1.push('banana');
eater1.eat();
//i am eating banana
- 可以实现封装,属性私有化
e.g.: Person(); - 模板化开发,防止污染全局变量
立即执行函数
此类函数没有声明,在一次执行过后即释放。适合做初始化工作。
(function (a,b){
console.log(a + b);
}(1,2))
//执行完立即释放,不占用存储空间
//正常的话函数会保留到程序执行完成
//表达式才能这样被执行
//被执行符号执行的表达式,会自动放弃函数名称
var test = function(){
console.log('a');
}();
//输出a之后输入test,输出undefined。