JavaScript 闭包解析
闭包的本质就是:函数A的内部函数B被A之外的函数C调用了。这样一个闭包的函数在返回时有没有释放资源的栈区。
了解js的闭包首先要清楚变量作用域的问题
function demo01(){
var index = 1;
}
demo01();
alert(index)// 不会弹出结果 index的作用域在demo01函数内部
function demo02(){
index = 2
}
demo02();
alert(index)
//会弹出2 因为在函数内部声明变量时没有用var,所以其实index是全局变量,全局变量与某个函数的生命周期无关。
var index = 1;
}
demo01();
alert(index)// 不会弹出结果 index的作用域在demo01函数内部
function demo02(){
index = 2
}
demo02();
alert(index)
//会弹出2 因为在函数内部声明变量时没有用var,所以其实index是全局变量,全局变量与某个函数的生命周期无关。
那么想要从外部获取内部的变量值该如何做呢?
我们可以在demo02中定义一个内部函数:
function demo02(){
var index02 = 3;
function inner02(){
alert(index02);
}
return inner02;
}
var getnum = demo02();//相当于获取到了inner02
getnum();//弹出结果3
inner02就是闭包。
//闭包使得index03变量一直存在内存中
//index03在函数demo03执行完毕后依然存在
function demo03(){
var index03 = 99;
//index03在函数demo03执行完毕后依然存在
function demo03(){
var index03 = 99;
addone=function(){
index03++;
}
function inner03(){
alert(index03);
}
return inner03;
}
var getnum = demo03();
getnum();//弹出结果99
addone();//index03的值增加1 addone本身是全局变量它的值是一个匿名函数,而匿名函数本身也是闭包,可以在函数外部对函数内部的变量进行操作。
getnum();//弹出结果100
所以滥用闭包可能导致内存泄露,因为闭包使得变量一直在内存中不会被垃圾回收。
如果把demo03当做对象,index03代表属性,inner03代表公开的方法,也要注意不要随便修改内部的属性值。