一、闭包是什么?
闭包让你可以在一个内层函数中访问到其外层函数的作用域
能在外层函数中访问内层函数吗? 显然不能
但是可以在内层调用外层作用域的变量
function fun(){
let outer = 1;
function f(){
let inner = 2;
console.log("outer:",outer);
}
f()
console.log("inner:",inner);
}
fun() //outer:1 inner未定义
二、闭包有什么用?
1.读取函数内部的数据
既然正常情况下不能读取内部的数据,那如果我必须要读取呢?
将内部函数return出去,以实现读取内部函数的数据
function f1(){
var n = 999;
function f2(){
console.log(n);
}
return f2;
}
var result = f1();
result(); //999
2.保持变量在内存中
变量n不会随着f1调用结束而被销毁,因为有与f2的闭包,n会保存在内容中,所以当再次调用的时候,n在第一次+1的基础上继续+1,变成了22
function f1(){
var n = 20;
function f2(){
n++
console.log(n);
}
f2();
return f2
}
var result = f1(); //21
result(); //22
三、闭包的缺点
既然变量可以一直保留,那么就会带来一个巨大的问题——内存泄漏
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题
解决方法:在退出函数之前,将不使用的局部变量全部删除