1.概念
一个函数对周围状态的引用捆绑在一起,内层函数中访问到其外层函数的作用域
2.简单理解
闭包 = 内层函数 + 引用的外层函数变量
简单代码示例:
function outer(){
let i = 1; // 被内层函数引用的变量
function fn(){ // 内层函数
console.log(i)
}
fn()
}
通常会在一个函数把闭包的结构包裹起来,用来保护被私有化的变量
3.闭包一定有return吗
不一定,上边的例子就没有return
4.闭包一定会内存泄漏吗
不一定,因为上边的例子就说明了 没有return 也没有对闭包内部私有化变量进行引用
5.什么时候使用return呢
闭包外部对私有化变量进行使用的时候就需要用到return
function outer(){
let i = 0;
let fn = function(){
console.log(i ++)
} return fn
}
const result = outer()
result() // 0
6.闭包与普通函数的区别
1、普通函数
变量i可以被修改,无法实现私有化
let i = 0;
let fn = function(){
console.log(i++)
}
fn(); //0
fn(); // 1
i = 100;
fn(); // 100
2、闭包函数
变量 i 已经被私有化,不会被外部修改
function outer() {
let i = 0;
let fn = function () {
console.log(i++)
}
return fn
}
const result = outer()
result() // 0
result() // 1
i = 100;
result() // 2
7.闭包为什么会出现内存泄漏
因为 count 以下边的为例
- 第8行的result是一个全局常量,代码执行完毕不会被立即销毁
- result使用了outer函数
- outer函数用到了fn函数
- fn函数里面用到了 i
- i 被引用不会被回收,所以一直存在
评论区