关于闭包

100 阅读1分钟

今天学习js,接触到了闭包,觉得是一个很有趣的东西,故以此记录一下。

  • 对于js,我们知道,程序中的任何一个函数,都能访问到其全局变量,如片段1。

片段1

<script>

    let count = 0; // 全局变量
    function fn() {
        count ++;console.log(`函数被调用${count}次`);
    }
    
    let re1 = fn, re2 = fn;
    
    re1();
    re1();
    re2();
    
</script>

image.png

  • 但有人并不满足于此,他们认为平级调用是一件很危险的事,于是思考如何由外部访问内部元素,如片段2,仅仅将片段1的代码,封装于outerouter函数中,但很明显,这并不满足要求,依然是平级调用。

片段2

<script>
    function outer(now) {
        let count = 0; // 全局变量
        console.log(`outer被${now}调用`);
        
        function fn() {
            count ++;
            console.log(`函数被调用${count}次`);
        }
        
        let re1 = fn, re2 = fn;
        
        re1();
        re1();
        re2();
    }
    outer(1);

</script>

image.png

  • 于是他们利用returnreturn,将函数传递出去,实现外部调用,这便是我所理解的闭包,如片段3。

片段3

<script>
    function outer(now) {
        let count = 0; // 全局变量
        console.log(`outer被${now}调用`);
        function fn() {
            count ++;
            console.log(`函数被${now}调用${count}次`);
        }
        return fn;
    }

    let re1 = outer(1), re2 = outer(2);

    outer(3)();
    outer(4)();
    re1();
    re1();

    re2 = re1;

    re2();
    re1();
</script>

image.png

  • 最后问一个小问题,如果其他js文件通过某种方式得以调用片段1中fnfn函数,这是否也可以称为闭包?也就是说,实际上每个js文件都是闭包?