闭包

77 阅读1分钟

浅聊闭包(一)

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、复盘

再回到方案一,其实就是:
    - 在方案一的外面包一层函数,让其成为内部函数,然后返回出去。
    - 在外部函数同层级定义一个变量来接收这个外部函数的调用
    - 此时完成比闭包
    
目的是什么?为什么要闭包?
    - 全局变量容易污染环境(占用内存、被其他函数随意调用)
    - 局不必哦按量又无法长期驻留
    - 闭包机制应运而生