闭包:闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取函数的内部变量,所以闭包可以理解成“嵌套在一个函数内部的函数“。闭包是将函数内部和函数外部连接起来的桥梁。本质上来讲是一个可以读取函数内部变量的子函数,因此闭包可以理解为“函数内定义的函数”。
例如:
function fn(n) {
let I = n;
return function() {
console.log(I++);
}
}
let a = fn(1);
a(); // 1
fn返回的子函数就可以看做是一个闭包。
闭包的作用:
1.延长变量的生命周期,函数运行结束也可使其变量长久缓存于计算机内存中;闭包函数保留了对该变量的引用,导致其不会被js垃圾回收机制回收;
2.将函数内部私有变量上升为全局访问,同时避免全局变量的污染;如果是一个全局变量,那么全局内所有函数都可以访问改变量,如果是闭包则无法直接操作变量,需要通过闭包来进行访问。
闭包还可以完成的功能:防抖、节流、函数柯里化。
闭包的缺陷:
闭包最大的问题就是有可能引发内存泄漏。闭包函数所引用的变量对象是不会被销毁的,除非闭包本身被销毁。闭包的使用过多会占用大量的内存,继而导致内存泄漏,造成网页的性能问题。当我们不使用闭包的时候可以将引用闭包的变量指向Null。