JS学习笔记之闭包,什么是闭包,闭包生成条件,闭包题目及解析。

闭包

谈闭包前我们先来了解一下函数

  • .函数定义阶段
    i.在内存中开辟一个存储空间
    ii.把函数体内的代码当做字符串一模一样的的放在这个空间中
    1.碰到的所有变量都不进行解析
    iii.把这个空间地址赋值给函数名(变量名)

  • 函数调用阶段

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

  • 函数的调用
    i.每一次函数调用都会开辟一个执行空间
    ii.你调用一次,开辟一个执行空间
    iii.执行完毕代码销毁
    iv.你再次调用的时候,再次开辟一个执行空间
    v.执行完毕代码销毁

在来谈谈什么情况下函数的执行空间不会被销毁

  • 一个不会销毁的函数执行空间
    i.一个函数在执行的时候,会开辟一个执行空间
    ii.所有代码在这个执行空间里面执行
    iii.执行完毕以后,这个函数执行空间销毁

  • 在一个特殊的情况下
    i.函数的执行空间是不会被销毁的

  • 什么是特殊的情况
    i.当函数内部返回一个“复杂数据类型”
    ii.并且在函数外部有变量接收一个“复杂数据类型”的时候
    iii.这个时候函数的执行空间不会被销毁

  • 这个不会销毁的函数执行空间
    i.什么时候会销毁
    ii.当外部接收的这个变量不再引用函数内部的返回值的时候
    iii.这个函数执行空间就销毁了

闭包

  • 闭包的生成有三个必要条件(缺一不可)
    1.在函数A内部直接或者间接返回一个函数B
    2.B函数内部使用着A函数的私有变量(私有数据)
    3.A函数外部有一个变量接收这个函数B
    这样就形成了一个不会销毁的函数空间

  • 闭包空间
    1.我们管这个不会被销毁的A函数的执行空间叫做闭包空间
    2.把函数A里面返回的函数B,叫做函数A的闭包函数
    3.官方给的定义后一句话:闭包==>函数内部的函数

  • 闭包的特点(优点和缺点并行)
    1.延长了变量的生命周期
    优点:因为执行空间不销毁,变量也就没有销毁
    缺点:因为执行空间不销毁,会一直存在内存中
    2.可以访问函数内部的私有变量
    优点:利用闭包函数可以访问函数内部的私有变量
    缺点:执行空间不会销毁,会一直存在内存中
    3.保护私有变量(只要是函数就有这个特点)
    优点:保护私有变量不被外界访问
    缺点:如果想访问,必须要利用闭包函数

  • 闭包函数的缺点"致命"
    1.因为当一段内存空间中有一个不会被销毁的东西一直存在
    2.那么就会出现内存占用,如果过多,就会导致内存溢出
    3.那么结果就是内存泄露

  • 啥时候用闭包好
    1.就是当你需要延长变量的生命周期的时候
    2.或者你需要访问某一个函数内部的私有变量的时候

闭包的小题目

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

解析:这里我按照画图的方式来解析这样比较直观更容易理解:
解析

function fn(i){
    
    
       return function(n){
    
    
           console.log(n + (i++))
       }
   }

   var f = fn(10)
   f(20)
   fn(20)(40)
   fn(30)(50)
   f(30)

解析

猜你喜欢

转载自blog.csdn.net/Bob_Yan623/article/details/108836860
今日推荐