什么是闭包:
就是函数的一个特殊用法
--把一个函数作为另一个函数的返回值
--也可以把闭包理解为就是个函数
--就是指函数与其周围的状态的组合
闭包的写法:
1.函数内部嵌套一个函数:必须要有一个函数套在另一个函数的内部 2.内部函数可以访问外部函数的变量
3.外部函数返回内部函数
function box() {
var a = 1;
return function () {
console.log(a);
};
}
let arr = box();
console.log(arr); //这里返回的是box里面的函数:ƒ () {console.log(a);}
arr(); //这里是调用了box里面返回的函数,外部可以使用到函数内部的变量
--在这里 a 和 return 就是闭包
--外可以使用到内部(局部)的函数和变量
闭包的特点:
1.局部变量常驻内存(像全局变量),不会污染全局命名空间
常驻内存:
let w = 1; //全局变量,什么时候都可以使用
function ww() {
let m = 2; //局部变量,在函数调用的那一刻可以使用
console.log(m);
}
ww();
console.log(m); //不能使用,会报错;函数执行完以后,函数的执行空间(词法环境)和变量就会被销毁(垃圾回收机制)
闭包的原理:
1.垃圾回收机制:被外部引用的局部变量不会被回收 2.作用域链:内部函数使用变量的时候会先在自身作用域中找,找不到就向他的父级作用域进行寻找,以此类推。
闭包的缺点:
使用不当会造成内存泄漏
--如果疯狂的调用 box,那么调用一次就会产生一个闭包。
function box() {
var a = 1;
return function () {
console.log(a);
a++;
return a;
};
}
let a = 1;
let resFN = box();
console.log(resFN);
let r1 = resFN();
console.log(r1);
let r2 = resFN();
console.log(r2);
--解决方法:
function box() {
var a = 1;
return function () {
console.log(a);
a++;
return a;
};
}
let a = 1;
let resFN = box();
console.log(resFN);
let r1 = resFN();
console.log(r1);
let r2 = resFN();
console.log(r2);
resFN = null; //当不再使用这个函数的时候给他设置为空