闭包(closure)是一个函数和它所引用环境的组合。创建闭包的常见方式是在一个函数内部创建另一个函数,而该内部函数可以访问外部函数的局部变量,当外部函数执行完毕后,通常那些局部变量会被垃圾收集器回收,但因为闭包的存在,这些变量会继续存在于内存中。
// 闭包 内部函数可以访问外部函数的变量
// 创建一个函数 fun1 内部函数 fun2 闭包
// 内部函数 fun2 闭包 可以访问外部函数 fun1 的变量 i
// 我们可以用闭包 实现一个计数器 使得每次调用 fun1 都会返回一个新的计数器函数
// 使得每次调用 fun1 都会返回一个新的计数器函数 使得内部函数 fun2 闭包 可以访问外部函数 fun1 的变量 i
function fun1() {
let i = 0;
// 内部函数,闭包,将 i 的值保留在内存中
function fun2() {
i++;
console.log(i);
}
// 返回 fun2 函数
return fun2;
}
// 调用 fun1 函数并将返回的 fun2 函数赋给 inner 变量
let inner = fun1();
inner();//1
inner();//2
inner();//3
// 调用 fun1 函数并将返回的新的 fun2 函数赋给 inner2 变量
let inner2 = fun1();
inner2();//1
inner2();//2
如果不返回fun2的值的时候输出fun的一的值时候就会出错
因为你写了并没有执行,并没有返回所以会是错的
当返回fun的2的值时,就在执行inner1时,每次执行一次i就会加1
如果新创建一个变量里面包含fun1时,里面的值就会从i的初始值开始算