JavaScript作用域链

本文深入探讨JavaScript中的函数作用域,包括上文成员和下文成员的概念,重点解析[[scopes]]如何保存作用域信息。通过实例分析函数在定义和调用时的作用域链生成,并解释了变量查找的规则,展示了作用域链如何帮助查找变量。同时,提到了函数的预编译过程,包括length和name属性的初始化,以及scope属性的作用。
摘要由CSDN通过智能技术生成

一种是上文成员(js语法可以直接访问的成员) 

            一种是下文成员(底层语法访问的成员)      

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

            function fn () {

                

            }

            console.dir(fn)

             这个"对象"内部保存的就是函数的作用域

             

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

             

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

             

function fn (n) {
				var a=20
				function  fm () {
					
				}
				
			}
			fn(100)//AO:{n:undef==>100,a:undef==>20,function fm(){}}
			fn()//AO:{n:undef,a:undef==>20,function fm(){}}

函数的预编译

函数在定义的时候就有了一些固定的属性 比如 length name

然后我们来了解了解scope这个属性

scope里面保存的就是作用域 也就是AO对象我们(不了解AO对象的可以看看前一篇预编译)

scope类似一个栈 先进后出 

我们举一个例子来讲解

<script>
    function a() {
            function b() {
                var bb = 234
                aa = 0;
            }
        var aa = 123;
        b();
    console.log(a);
    }
    var glob = 100;
    a();
</script>

在全局作用下声明的a

然后执行a 然后执行b 在执行a 最后终止

在创建b的时候

 这就是scope 因为最先有的go作用域 然后执行的a 在执行a是创建了b 所以创建b时b的scope就诞生成立了 因为类似于先进后出的道理 所以GO 对象最下面然后是a的AO对象 一直到b执行

 也就添加了b的AO对象在最上层 当b的执行完毕之后b的AO对象被销毁

就像这样形成了作用域链 当在本层作用域里面查找不到x变量时 就在上层作用域去找 也就是scope的下一层

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值