浅谈js闭包

萝らか妹 提交于 2020-02-24 08:02:07

什么是闭包?

在了解闭包之前,让我们来回顾一下什么是变量作用域?

变量根据作用域的不同分为两种:全局变量(在函数外部)和局部变量(在函数内部)。

  1. 函数内部可以使用全局变量。
  2. 函数外部不可以使用局部变量。
  3. 当函数执行完毕,本作用域内的局部变量会销毁。

闭包的含义

闭包(closure)是指有权访问另一个函数作用域中变量的函数,是JavaScript中,函数的一种高级应用。

简单理解就是,一个作用域可以访问另外一个函数内部的局部变量。

生成闭包的三个必要条件(三个条件缺一不可)

  • 在函数A内部直接或者间接返回一个函数B
  • B函数内部使用着A函数的私有变量(私有数据)
  • A函数外部有一个变量接收着函数B

闭包函数会形成一个不会销毁的函数空间

function a(){
                //num变量就是函数a的私有变量    
                var num=100;
                return function(b){
                        console.log(num)
                 }
        }
            //res 接收的是a函数执行以后的返回值
        	//res接收的就是函数a内部返回的一个复杂数据类型(函数b)
       		//  =>导致函数a的执行空间不会销毁
       		
        //res 随时可以是一个函数a里面返回的函数b
         //   =>res可以随时调用
        res()

        //当res调用的时候,打印num,打印出来的就是a函数内部的私有变量num的值
  • 把这个不会销毁的a函数的执行空间叫做闭包空间
  • 把函数a里面返回的函数b,叫做函数a的闭包函数

闭包还可以间接返回一个函数

  • 上面的案例代码中是闭包直接返回一个函数b,闭包还可以间接返回一个函数,return一个对象或者数组,在这个对象或者数组中有一个函数。
  • 当需要访问一个数据的时候,可以使用直接返回或者间接返回
  • 当需要访问多个私有数据的时候,就需要使用间接返回的方式,返回的一个对象里面包含多个闭包函数
function fn(){
                var num=100;
                var num=200;
       
            return  {
                    getNum:function(){
                            console.log(num)
                    },
                    getNum2:function(){
                            console.log(num2)
                    }
            }
        }

        var res=fn()
        //res得到的是一个对象
        //这个对象里面有一个函数是fn的闭包函数
        console.log(res)
        res.getNum()
        res.getNum2()

闭包的特点

  1. 延长了变量的生命周期
  2. 可以访问函数内部的私有变量
  3. 保护私有变量

关于闭包函数的面试题

下列代码会输出什么

function fn(i){
       return function(n){
           console.log(n + (--i))
       }
   }
   
   var f = fn(2) 
   f(3)  //4
   fn(4)(5)  //8
   fn(6)(7) //12
   f(8) //8

函数执行过程图解
函数在这里插入图片描述
函数有两个阶段

  1. 函数定义阶段

    • 在内存中开辟一个存储空间
    • 把函数体内额代码当做字符串一模一样的放在这个空间中
    • 把这个地址空间赋值给函数名
  2. 函数调用阶段

    • 按照函数名(变量名)找到对应的存储空间
    • 重新开辟一个函数执行空间
    • 在这个执行空间里面进行形参赋值
    • 在这个执行空间里面进行预解析
    • 把函数存储空间的代码复制一份到执行空间里面执行一遍
    • 执行完毕之后,这个开辟出来的执行空间销毁

    以上就是我对js闭包的理解啦,如果有问题欢迎指出哦~

    家中逆战,无畏疫情!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!