什么是闭包
如果一个函数用到了定义在该函数作用域之外的变量,那么这个函数加这个变量,就叫做闭包
function f1() {
let a = 1;
function f2() {
console.log(a);
}
a = 2;
f2();
}
f1() //2
//a和function f2() {console.log(a)}就是一个闭包
闭包的作用:「间接访问一个变量」也就是「隐藏一个变量」。
闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」
因为我们不想这个变量被谁都可以随意赋值改变,也就是这个变量不能是全局变量,只能是局部变量。
那之后该怎么对这个局部变量操作?写一个函数,这个函数可以对这个局部变量进行操作。这时你就会发现,自己写了个闭包(这个局部变量+这个函数)
举例
比如jQuery函数,先通过选择器选出对应的元素构成elements数组,这个elements数组就是个局部变量。之后返回的jQuery对象里面的所有函数都会对这个局部变量elements进行操作。这样局部变量elements和这些函数形成了闭包。只有这些函数可以对elements操作,其他任何人都无法对elements操作。
闭包的缺点:
(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。