作用域链查找机制(回顾)

文章详细阐述了JavaScript中的全局/私有变量的作用域,作用域链的概念以及其形成过程,函数的执行步骤,并描述了作用域链在查找变量时的机制。全局变量存储在全局上下文的变量对象中,而私有变量存在于函数执行的私有上下文中。作用域链决定了变量查找的顺序,从当前上下文开始,沿着作用域链向上级作用域查找,直到全局上下文。如果找不到变量,将会抛出错误或在全局对象上创建。

全局 / 私有变量

全局变量:在全局上下文EC(G)中的全局变量对象VO(G)中,存储的变量
私有变量:在函数执行形成的私有上下文EC(XXX)中的变量对象AO(XXX)中,存储的变量
包括:

  1. 当前函数执行形成的上下文中:声明过的变量或者函数
  2. 函数定义的形参变量

作用域的概念

当前函数[[Scopes]] = 当前函数创建时候所在的上下文
简单来说:函数的作用域取决于当前函数创建时候的上下文,哪个上下文创建,作用域就是谁

作用域链 scopeChain 的概念

scopeChain:<当前EC, 函数[[scope]]>
查找变量时,按照该链式关系找(先找自己上下文,自己没有,按照作用域链向上级作用域找)
包含:

  1. 当前形成的上下文
  2. 当前函数所对应的scope作用域

作用域链 scopeChain 的形成

作用域链是在函数执行的时候形成的

函数执行步骤

  1. 创建私有上下文EC(有存放私有变量的变量对象AO)
  2. 进栈执行(把全局上下文放在后面)
  3. 初始化作用域链 scopeChain:<当前EC,函数[[scope]]>
  4. 初始化 this 指向
  5. 形参赋值(包括初始化 arguments)
  6. 变量提升
  7. 代码执行
  8. 执行完可能出栈(也可能不出栈)

作用域链查找机制

在当前上下文中,代码执行的过程中遇到一个变量时:首先看它是否是私有

  1. 如果是私有的,接下来的所有操作,都是操作自己
  2. 如果不是私有的,则按 作用域链 scopeChain 进行查找,在哪个上下文找到,当前变量就是谁的
    3 .一直找到全局上下文为止
  3. 如果找到 EC(G) 都找不到:
    a.获取变量会直接报错
    b.设置值,则直接给 GO(window) 加属性
<script type="text/javascript">
  function a(){
    function b(){
      function c(){}
    }   
  }
</script>
// 以a函数的作用域为例
a defined a.[[scope]]-->0:GO
a doing   a.[[scope]]-->0:aAO
                        1:GO

b defined b.[[scope]]-->0:aAO
                        1:GO

b doing   b.[[scope]]-->0:bAO
                        1:aAO
                        2:GO
c defined c.[[scope]]-->0:bAO
                        1:aAO
                        2:GO			
c doing   c.[[scope]]-->0:cAO
                        1:bAO
                        2:aAO
                        3:GO

经典例题1
经典例题2

参考

作用域图解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柳晓黑胡椒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值