闭包
闭包是什么
红宝书中的定义是:闭包就是有权访问另一个函数作用域中变量的函数。
形成闭包的原因
内部的函数存在外部作用域的引用就会导致闭包。
var a=1;
function fn1(){
var b=2;
function fn2(){
console.log(a,b);
}
}
这里fn2函数中就存在外部作用域的引用,所以就会产生闭包。
闭包变量存储的位置
闭包中的变量存储位置是推内存。
闭包的作用
-
保护函数的私有变量不受外部的干扰。形成不被销毁的内存。
-
把一些函数内的值保存下来。闭包可以实现方法和属性私有化。
闭包需要注意什么
闭包容易导致内存泄漏,闭包会携带其他函数的作用域,因此会比其他函数占用更多内存。过度使用闭包会导致内存占用过多。
检查内存泄漏
我们先来检测没有闭包的情况
let a = 1;
我们看到堆内存在上升后又释放了。我们再来检测一下闭包的情况。
function fn(){
let a = 1;
return ()=>{
console.log(a);
}
}
let f = fn();
f();
上图可以看出堆内存中的占用一直存在。