作用域链AO GO

一个函数的AO变化情况:

先赋值形参 才有fm函数的提升

fn运行带参数 :AO{n:undefined==>100,a:undefined==>20,function fm()}

fn运行无参数 :AO{n:undefined,a:undef,function fm(){}}

        function fn(n){
            var a=20
            function fm(){

            }
            // return 
        }
        fn(100)//AO{n:undefined==>100,a:undefined==>20,function fm()} 先赋值形参 才有fm函数的提升
        fn()//AO{n:undefined,a:undef,function fm(){}}

函数有属性

      1.  length

      2. name anxxxxxs

      3.[scopes] 作用域

        js对象有两种成员 一种是上文成员(js语法可以直接访问的成员) 一种是下文成员(底层语法可以访问的成员)

        [[]]括起来的成员名就是下文成员

函数在创建定义/声明的时候 就有了[[scopes]]作用域 里面保存了上层的AO对象

函数调用时会生成AO对象--AO保存在scopes对象内部

        函数生成了就会有一个属性[[scopes]] 作用域对象 (只能引擎使用)

        函数调用时 生成AO对象 会把AO对象放在scopes

        每次调用都会放在scopes前面(顶部 序列一)

        每个函数scopes数组中天生就有一个AO对象 就是这个函数的上层AO

        function fn(a) {
            var a = 30
            return function fun() {}
            function fm() {//fm在fn的AO中生成时 就会生成一个fm的scopes
                var b = 20
                console.log(a);
            }
            fm()//第一个AO  顶端是fmAO  会引用fn的scopes排在fm的AO中(fm还没调用时就在fm的scopes中生成了 fm的AO再调用后生成) 因为fm可以调用fn中的变量
            fm()//再调用fm 在fm的scopes中生成另一个AO

        }

        fn(100)//第一个AO  函数没运行时scopes中只有一个GO
        fn(200)//再调用fn 重新调用生成另一个fn的scopes 中的fm函数又会生成另一个fm的scopes
    
        var a=fn(0)
        a.fun(100)
        a.fun(200)//这两个都在fn中生成AO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值