javascript闭包(closure)
以前面试的时候,有面试官问到过此问题,当时没回答出来。
后来回去了,深入了解了下关于闭包,下面是我的笔记和理解。
1.变量的作用域
假如你直接在函数外面定义一个变量,函数是可以直接访问这个变量的。
var a = 0;
d = 4;
function demo(){
var b = 1;
c = 2;
console.log("a="+a);//0 函数内没有a变量然后向函数外面查找
console.log("d="+d);//4 函数内没有d变量然后向函数外面查找
}
function demo2(){
var d = 5;
a = 1;
console.log("a2="+a);//1 函数内从新给a赋值1 所以所处的是1
console.log("d2="+d);//5 函数内有定义d变量
}
demo();
demo2();
//console.log(b);//error b定义在函数demo里面 外面访问不到
console.log(c);//2 函数demo里 定义了一个全局变量
console.log(a)//1 //函数demo2改变了全局变量a的值
console.log(d)//4 //函数demo2没有改变全局变量的值
我们来理解下上面的例子,然后明白
函数外面定义变量加上var是全局变量,不加则是局部变量
函数里面定义变量加上var是函数内部局部变量,不加则是全局变量
2.闭包
那么问题来了,如何读取到函数的局部变量呢??
function demo(){
var a = 111;
//我就是闭包
function demo2(){
console.log(a);//访问到了
}
return demo2;//把demo2暴露出去
}
var d = demo();
d();//111;
闭包很难理解吧,那就记住一句话
能读取其他函数内部变量的函数就是闭包,比如demo2
3.闭包作用
都说闭包,闭包,那闭包有啥用,一般来说有2个。 一个是读取其他函数内部的变量, 另一个是让读取到的变量始终保存在内存中。
听起来是不是感觉很吊的样子,其实也就那个样子…
function d1(){
var a = 111;
aAdd = function(){
a +=1;
}
function d2(){
console.log(a);
}
return d2;
}
var d = d1();
d();//111;
//这个时候 a已经保存在内存中了
aAdd();
d();//112
就是这么回事,当然我们也不能乱用闭包,这样会导致大量的变量保存在内存中,导致内存泄露的可能。