引言:JavaScript中的函数是一个对象,也是一等公民.函数既可以赋值给变量,也可以作为函数的参数,同时,还可以作为另一个函数的返回值.那么,在JavaScript中,闭包就是一个函数.
1. 闭包的概念:
官方理解:闭包是指一个函数与其周围的状态(词法环境)的组合.这个环境包含了在函数声明时所能访问的所有变量和参数,并且在函数执行过程中始终存在.
通俗理解:闭包就是一个函数,是指一个函数作为另一个函数的返回值.
2. 闭包的写法:
(1) 函数嵌套函数:闭包必须有函数嵌套函数的结构.
(2) 内部函数可以访问外部函数的变量:内部函数可以访问外部函数中的变量,即使在外部函数执行完毕后,这些变量仍然可以被访问.
(3) 外部函数返回内部函数:外部函数必须返回内部函数,才能形成闭包.
*****闭包的经典写法:
<script>
//变量a和return返回的函数叫做一个闭包
function fn(){
let a = 1;
return function(){
a++;
return a;
}
}
//调用fn以后,返回了内部函数
let newFn = fn();
console.log(newFn());
//外部函数可以使用一个函数定义的局部函数和局部变量
newFn();
</script>
3. 闭包的原理:
(1) 垃圾回收机制:自动回收变量占用内存机制.两种算法:(1)标记清除(2)引用计数.
(2) 作用域链:在函数中使用一个变量的时候,会先在自身作用域中找,找不到就会去父级作用域中,依次类推,直到全局.
4. 闭包的作用:
(1) 可以让局部变量像全局变量一样常驻永存;同时,也不会污染全局变量的命名空间.
(2) 产生私有变量,内部函数调用外部函数的局部变量,此时,这个局部变量就会变成内部函数的私有变量.
(3) 闭包使用不当会造成内存的泄露,想要解决此弊端的话,可以手动将其赋值为null.
5. 闭包的应用场景:
(1) 私有变量
使用闭包可以实现变量的私有化,从而避免全局变量的污染.
(2) 柯里化
柯里化是指把一个多参函数转化为一个只有一个参数的函数.
使用闭包可以实现柯里化,从而方便地进行函数组合.