闭包

62 阅读2分钟

闭包

        什么是闭包,函数内返回一个新函数,返回的函数内中有权访问外部函数中局部变量
        function fn() {

            var a = 1

            function fn1() {

                console.log("aa");

            }

            return fn1
        }
        var f = fn()
        f()//aa


        // 共有变量 私有变量 受保护变量

        // 闭包会造成内存泄漏

        // 闭包目的是为了创建私有变量
        

全局变量 缺点

         var a = 1
        function fn() {
            a++
           console.log(a);

        }

        function fn1() {
            a += 10
        }

        fn() //2

        fn1() // 13

        fn() // 14

        fn() // 14

        console.log(a);
       全局变量有可能会造成同名的污染
       当调用插件时,不清楚插件内的同名全局变量,可能会造成污染

局部变量缺点

        局部变量,当函数运行完成后会自动销毁,每次重新执行函数会重新创建定义

        局部变量不具备长期存储性,当函数执行完成局部变量就会销毁

        局部变量函数外不能调用,具有一定私密性,不会被污染

        function fn() {
            var a = 1
            a++
            console.log(a);
        }

        fn() // 2

        fn() //2

        fn() // 2
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        

闭包

       // 在函数运行完成后,如果这个函数中的局部变量或者参数在其子级作用域有被调用,就
            不会销毁

    1.    function fn() {
            var a = 1
            var b = 2
            return function () {
                a++
                console.log(a);
            }

        }
               var f = fn() // 返回函数,不会调用

                        f()//2

                        f()//3

                        f()//4

       2.       var obj = (function () {

                var a = 1

                return {

                    paly() {

                        a++

                        console.log(a);

                    }

                }


            })()

            obj.paly() //2

            obj.paly() //3
            
          // 闭包,子级作用域有权访问父级作用域中局部变量,用来实现私有变量,执行函数后返
            回内部 子级函数,并且子级   

          // 全局变量可以当最外层的父级

          // 函数调用了父级函数中局部变量,该局部变量具备可长期存储,环境外无法访问的特征,减
          少了 同 名变量的污染
         
           // 会造成内存泄漏