js的学习之路(06)---作用域链

    函数有属性
        length name [[scoped]](现在叫scopes)
        js对象有两种成员 一种是上文成员(js语法可以直接访问的成员) 
                          一种是下文成员(底层语法访问的成员)
        用[[]]括起来的成员名 就是下文成员
        function  fn(){
            
        }
        console.dir(fn)
        这个“对象”内部保存的就是函数的作用域
        
        函数在定义/声明的时候 就有了[[scopes]] 里面保存上层的AO对象
        
        函数调用时生成AO对象 AO对象保存在scopes对象内部
        
        

          函数生成了就会有个属性[[scopes]] 作用域对象(只能引擎使用)
          函数调用时生成AO对象 把AO对象保存在scopes对象内部
          每次调用都会放在scopes前面(顶部)
          每个函数scopes数组中天生就有一个AO对象 就是这个函数上层的AO
            


            function fn(){
                var a=20
                function fm(){
                    var b=30
                    console.log(a)
                }
                fm()
                fm()
            }
            fn()
            fn()

例:

	function fun(n,o){
				console.log(o)
				return{
					fun:function(m){
						return fun(m,n)
					}
				};
			}
			var a =fun(0)//undefined o没有赋值
			a.fun(1)//0 a.fun上没有n 在上层AO里找 也就是调用fun产生的AO对象 n=0
			a.fun(2)//0
			a.fun(3)//0
			var b = fun(0).fun(1).fun(2).fun(3)//undefined 0 1 2 
                        //每次调用都会生成新的AO对象 上层AO中的n值作为下一次调用的o值
			var c =fun(0).fun(1)//undefined 0
			c.fun(2)//1 和上面同理 只是这两次是分开调用生成新的AO对象不会保存到下次
			c.fun(3)//1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思考猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值