JavaScript闭包

JavaScript闭包

为什么要使用闭包

正常函数将函数体内的代码执行完毕之后就会销毁掉这个函数空间

而且每调用一次函数就会开辟一个新的内存空间,新的内存空间与之前的内存空间是不受任何影响的。

所以调用一次x函数就会让a+1变成2,因为每次调用都会开辟一个新的内存空间,他们是不受任何影响的。所以再调用一次x函数就会再让a+1变成2。不管调用多少次结果都是2

        function x(){
            let a = 1;
            function y(){
                console.log(++a);
            }
            y()
        }
        x() //2
        x() //2
        x() //2

但是如果我们想要实现延伸函数作用域范围则需要用到闭包,换句话说就是让函数每次调用让a自加一

        function x() {
            let a = 1;
            // 将这段代码返回
            return function y() {
                console.log(++a);
            }
        }

        let aa = x();
        aa() //2
        aa() //3
        aa() //4

以上操作将x的++a函数体返回给aa,然后调用。这样可以实现延伸作用域范围(闭包),使外面作用域访问函数内部作用域。由此每次调用函数就会访问到x函数体内部的y函数使a变量自加一。最终就实现了每调用一次就会让a自加一

看一下这个案例

        function x() {
            let a = 1;

            return function y() {
                let b = 1;
                function z() {
                    console.log(++a);
                    console.log(++b);
                }
                z()
            }
        }

        let aa = x();
        aa() //a=2,b=2
        aa() //a=3,b=2
        aa() //a=4,b=2

这个案例函数体x里面只有a形成了闭包,所以每次调用只有a会自加一而b没有形成闭包所以不管调用多少次都是2

让a和b都形成闭包可以这么做

        function x() {
            let a = 1;

            return function y() {
                let b = 1;

                return function z() {
                    console.log(++a);
                    console.log(++b);
                }
            }
        }

        let aa = x()();
        aa() //a=2,b=2
        aa() //a=3,b=3
        aa() //a=4,b=4
评论区
头像