什么是闭包?如何制造闭包?

149 阅读1分钟

基本概念

闭包是指有权访问另一个函数作用域中变量的函数

如何形成闭包

内部的函数存在外部作用域的引用就会导致闭包。

词法作用域对执行环境的保护

Javascript的作用域有两部分组成即词法作用域和动态作用域 前者是静态的,比如

        var x = 1
        function a() {
            var y = 1
           function b() {
                var z = 2
                console.log(x, y, z)
            }
            return b
        }
        var fn=a()
        //b无论在何处执行都是可以读取到x,y,z
        fn()

闭包形成的几种方式

函数作为返回值

         function createMine(){
            const private='秘密'
            return function(){
                console.log(private)
            }
        }
        const m =createMine()
        m()

第一种方法就是这个工厂函数将返回一个匿名函数。这样按照作用域规则,匿名函数确实可以调用工厂函数createMine的作用域。而由于外部任何函数又无法直接访问createMine的局部变量。

函数作为参数

        const arr=[]
        function createMine(arr){
            const private='秘密'
            arr.push(function(){
                console.log(private)
            }) 
        }
        createMine(arr)
        arr[0]()

该方式通过函数参数为值传递的概念,将函数内部变量存储在实形参内,从而达到目的

利用作用域

        let fn
        function createMine(){
            const private='秘密'
            fn=function(){
                console.log(private)
            }
        }
        createMine()
        fn()

面试攻略

  • 说清闭包产生的原因,不要把循环陷阱当做闭包