浅聊闭包(一)
1、需求背景
客户让做一个函数,要求这个函数每执行一次就累计减一。
方案一:
var coount = 10;
function fn() {
count--;
console.log(`count的值是:${ count }`);
}
项目经理一看:居然使用全局变量,这个东西占内存不说。其它任意函数都可以随便调用,会污染环境!
方案二:
function fn() {
let count = 10;
count--;
console.log(`count的值是:${ count }`);
}
糟糕!!!测试了一把发现不对,没达到要求。
方案三:
function fn() {
let count = 10;
function inner() {
count--;
console.log(`count的值是:${ count }`);
}
return inner;
}
let result = fn(); //完成这一句才算是闭包
2、总结
不知不觉在完成客户需求过程中,我们写出了一个闭包。 下面总结一下闭包必须要满足的4个条件反推什么是闭包:
必须满足一下4个条件才算是闭包:
1、有函数嵌套
2、内部函数引用外部作用域的变量参数
3、返回值是函数
4、创建一个对象函数,让其长期驻留
3、复盘
再回到方案一,其实就是:
- 在方案一的外面包一层函数,让其成为内部函数,然后返回出去。
- 在外部函数同层级定义一个变量来接收这个外部函数的调用
- 此时完成比闭包
目的是什么?为什么要闭包?
- 全局变量容易污染环境(占用内存、被其他函数随意调用)
- 局不必哦按量又无法长期驻留
- 闭包机制应运而生