请选择 进入手机版 | 继续访问电脑版
查看: 68|回复: 0

JavaScript--关于闭包(closure)

[复制链接]
  • TA的每日心情
    开心
    昨天 11:12
  • 签到天数: 1465 天

    [LV.10]以坛为家III

    1159

    主题

    3064

    帖子

    9万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    93812

    推广达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2019-8-17 18:21:34 | 显示全部楼层 |阅读模式

    马上加入IBC,查看更多教程

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    js代码在实行前会做的几件变乱:
    1.代码检测
    2.预编译:在实行代码之前会对代码中的函数以及变量提前声明 并且做一些其他的处理
      1.函数在实行前的一瞬间,会生成一个OA(object action)对象
      2.函数的形参作为OA对象的属性名,实参作为AO对象的属性值
      3.分析var声明,变量名作为AO对象的属性名,值为undefined,如果遇到和参数同名的变量不去做任何改变
      4.分析函数声明,函数名作为AO 对象的属性名,值为函数体,如果遇到同名函数直接覆盖
    接下来我们来分析这段代码:(按照预编译的四步走)  
      function fun(a){
                              console.log(a)
                              var a  = 100
                              console.log(a)
                      }
                      fun(10)
      1.在实行fun之前产生一个fun OA对象 ,
      2.函数的形参a = 10 ,存入AO对象
      3.var声明了一个a 值为undefined
      4.分析函数 这个函数里面并没有内层函数
    做完以上分析之后 再来实行这个程序 实行过程中碰到变量的输出或改变值 就去OA对象中找:
      console.log(a)   此时a = 10 输出10
      a = 100              此时a=100
      console.log(a)   输出100
    这是一个函数整体的实行过程,而闭包的形成就是在一个函数里面嵌套一个或多个函数,接下来我们再来分析闭包
      function a(){
                                var num = 100;
                                function b(){
                                          num ++;
                                          console.log(num)
                                }
                                return b;
                      }
                      var fun = a()
                      fun()
                      fun()
    1.在a()实行前生成一个OA对象
    2.没有形参
    3.声明var num = undefined
    3.声明函数b() 值为函数体
    然后实行a() 给num复制为100,然后返回b()函数 fun=function b(){ } 接下来在实行到fun()时:
    1.在fun()实行前产生一个OA对象
    2.没有形参
    3.没有var声明
    4.没有函数声明
    然后实行b()函数,此时num++,会先在b()自己的作用于内查找有没有num这个变量 如果没有沿着作用域链去查找num
    找到a()中有num变量 这是对a()中的num实行++操作 所以a()中的num会发生改变 num=101
    后续又实行了一次fun() 所有操作与上一个fun相同 但是此时a()中的num=101 再进行++操作后 num = 102
    用图像化来表示整个程序的实行过程中OA发生的变化
    182502cn7w7ztc55u6x7c6.png


    *在整个程序实行过程中 最最需要注意的是 函数每实行一次都会产生一个相应的OA对象
    就算是同一个函数 只要再次实行都会产生一个对应的OA活动对象
      
        
         
        
        




    来源:https://www.cnblogs.com/blogzzy/archive/2019/08/17/11369684.html
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则