JavaScript入门(六)作用域、作用域链

JavaScript(六)作用域、作用域链

一、运行期上下文

  • 定义: 当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行 期上下文定义了一个函数执行时的环境,函数每次执行时对应的执 行上下文都是独一无二的。也就是说,多次调用一个函数会导致创建多个执 行上下文,当函数执行完毕,它所产生的执行上下文被销毁。

  • 特别的是GO 是不在函数内函数创建前的运行期上下文,其余都是AO。也即是GO时,其上下文时全局的;其他函数在执行时运行期上下文(如字面意思)为函数内。

  • 运行期上下文即为上一篇文章涉及的GO、AO。

  • 不过,正如上述所说,函数的每次执行会被创建运行期上下文,每次执行完也会被销毁。

  1. 假如在连续调用两次demo(),例如
//...任意前文
    demo();//在调用时会创建一个AO,调用完销毁。
    demo();//调用时,会创建一个AO,调用完销毁。
    //注意! 俩个AO不为同一个
//... 任意后文
  1. 那么在函数内如果调用一个函数呢,我们说过函数在执行时就会创建独一无二的运行其上下文(也即是GO\AO),那么对于这两个创建和销毁是如何呢?
    //在这里相当于有一个栈(先进后出,后进先出)
    // 为了方便表示我们把外层函数执行时创建的AO称为AO(外),内层则为AO(内)--(个人为了方便理解使用)
    //那么过程是这样的:
    // AO(外)-创建
    // AO(内)-创建
    // AO(内)-销毁
    // AO(外)-销毁
    //这样看起来就是函数执行顺序和执行完顺序对应着创建和销毁,的确是这样。
    demo(demo());
  • 运行期上下文为函数执行时创建,那么对于函数内部存在全局变量,或者函数外部的变量,以及为何如果一个变量在函数内外均有定义,为何在函数内输出该值的话是最近的内部的呢?这个过程是怎么样的?以下作用域会讲解。

二、作用域以及作用域链

  • [[scope]]: 每个JavaScript函数都是一个对象,对象中有些属性我们可以直接访问,但有些不可以。可以属性仅供JavaScript引起存取。[[scope]]就是其中一个。

  • [[scope]]指的是我们所说的作用域,其中存储了运行期的上下问的集合。

  • [[scope]]中所存储的执行期上下文对象的集合,这个集合是成链式链接,我们把这种链式链接叫做作用域链。

示例一

    function a() {

    }
    var glob = 100;
    a();

示例一在执行时,有以下步骤

Step1: a 函数被定义时,发生以下过程
来源:bilibil渡一教育课程

由上图可见,a的[[scope]]放了一个scope chain 值链表的引用,scope chain链表内, 0 位置为放GO对象的一个引用,其具体内容也就是上一篇文章介绍的预编译后的GO的情况(部分属性未介绍)

Step2: a 函数被执行时,发生以下过程
来源:bilibil渡一教育课程
当函数执行时,会产生该函数的运行期上下文AO,然后正如上图的 AO,然后进入scope chain (具有栈的性质),AO会入栈,此时0的值为 AO对象的引用,1为GO。

当查找变量时, 从0的对应的表内先开始查找,之后再到1 ,也就是从作用域的顶端以此向下查找。

三、 拓展:

若a函数内存在b函数那么情况时怎么样的呢?

首先是a定义,a执行,后在a中执行b前,b会继承a的scope chain的所有内容,然后当执行b时(本文中所有执行时,均为执行的前一刻),会生成b的运行期上下文,可以为了形象记为bOA,然后进入scope chain,

此时b[[scope]]内容是 :
0 -->bOA
1 -->aOA
2 --> GA

此时,a[[scope]]内容是:
0 -->aOA
1 --> GA

  • 其中,当 b的函数执行导致aOA值发生变化的话,a[[scope]]也会变化,在scope chain 里面只是引用,可以想象为连线。
  • 当该次b执行完成后,bOA就会被销毁。

声明: 学习资源为 渡一教育-Web前端开发 ,图片也出于此网址


以上,此为本人学习过程中的笔记,可能因为能力不足存在一些不足,还请大家多多包涵和给予建议,共同进步。如有问题,敬请私信。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值