JS 作用域 , 作用域链 精讲

相关概念

运行期上下文:

当函数执行时(也可以是执行前),会创建一个成为执行期上下文的内部对象 ,一个执行期上下文定义了一个函数执行时的环境AO/GO,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用会导致创建多个执行上下文,当函数执行完毕,他所产生的执行上下文被销毁;

[[scope]]属性:

每个Javascript函数都是一个对象,对象中有一些属性我们可以访问,但是有些不行,这些属性,仅供JavaScript引擎存取,
[ [ s c o p e ] ],就是其中一个,[ [ s c o p e ] ],指的就是我们所说的作用域,其中储存了运行期上下文的集合,

作用域链:

[ [ s c o p e ] ] 中所储存的执行期上下文对象的集合,呈链式链接结构,我们把这种链式链接叫做作用域链。

查找变量:

在哪个函数查找变量,就从哪个函数的作用域顶端查找变量


function a(){    //1.当函数a被定义的时候,在a.scope作用域链产生一个GO在作用域链的最顶端0位,类数组,0:GO:{a:function}
    var aa = 100;
    function b(){
        var cc = 100;
        console.log(cc)
        aa = 10;

    } b(); //3当函数b被调用的时候,在函数b的内部继承了 之前scope作用域链,并把自己的AO 放在最顶端 :0 AO:{cc:100}
                                                      // 1 AO:{aa:100,b:function}
                                                      // 2:GO:{a:function}
                                                      // 在b函数的scope作用域链,改变aa的值,可以从作用域顶端查找变量,
                                                      //结果是可以更改的,也就证明了b函数生成的作用域链是引用了他外部函数AO以及GO
    console.log(aa)
}
a()//2. 当函数被调用的时候,在a函数的内部,产生了AO的执行期上下文,放在作用域链的最顶端0位:0 :AO{aa:100,b:function} 
                                                                                 // 1: GO{a:function}
//  总结 其实每次内部产生新的作用域scope 都会引用之前的scope,并把当前的scope AO 置顶,并在需要的时候从顶端往下查询变量

图片代码在这里插入图片描述
每一次 函数结束后,每次产生的执行期上下文都会被销毁,等下次执行,产生新的类似执行期上下文,重新放在顶端,周而复始,循环下去
类似,就是虽然看上去一样,但不是同一个,这次执行和上次执行不是一个AO,每次执行都会产生新的作用域链

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值