什么是闭包?闭包使用场景?有什么缺点?
首先思考这样一个问题:如何从函数外部读取到函数内部的局部变量?
正常情况下,这是办不到的!只有通过变通的方法才能实现。
function f1(){
var a=1;
function f2(){
console.log(a);
}
}
在上面的代码中,f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。
这就是Javascript语言特有的"链式作用域"结构:
子对象会一级一级地向上寻找所有父对象的变量。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们就可以在f1外部读取它的内部变量了
function f1(){
var a=1;
function f2(){
console.log(a);
}
return f2;
}
var F=f1();
F(); //1
闭包概念说起来很抽象,我认为闭包就是一个可以访问其他函数作用域的函数,就如上面的代码所展示的
闭包用途:
读取函数内部的变量
让变量一直保存在内存中,不会被垃圾回收机制回收
function f1(){
var a=1;
Add=function(){a++}
function f2(){
console.log(a);
}
return f2;
}
var F=f1();
F(); // 1
Add();
F(); // 2
Add没有var定义,它会变为全局变量,所以我们可以直接在全局调用它,第一次调用F()后a没有被回收,调用Add()时是在a=1情况下a++
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。