深入学习js之——执行上下文#7

深入学习js系列是自己阶段性成长的见证,希望通过文章的形式更加严谨、客观地梳理js的相关知识,也希望能够帮助更多的前端开发的朋友解决问题,期待我们的共同进步。

如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


《深入学习js之——执行上下文栈》中说过,当JavaScript代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution context)

对于每一个执行上下文,都有三个重要的属性:

变量对象(Variable object VO) 作用域链(Scope chain) this

本文我们结合着这三个部分的内容,讲讲执行上下文的具体处理过程。

思考题

《深入学习js之——词法作用域和动态作用域》中,提出这样一道思考题:

// 思考题一:
var scope = "global scope";
function checkscope(){
  var scope = "local scope";
  function f(){
    return scope;
  }
  return f();
}
checkscope();

// 思考题二:
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();
复制代码

两段代码都会打印local scope,但是还是有些许差异的,本文就详细的解析执行上下文栈执行上下文的具体变化过程。

具体分析

我们分析第一段代码:

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();
复制代码

执行过程如下:

1、执行全局代码,创建全局执行上下文,全局上下文被压入执行上下文栈

ECStack = [
  globalContext
];
复制代码

2、全局上下文初始化

globalContext = {
  VO: [global],
  Scope: [globalContext.VO],
  this: globalContext.VO
}
复制代码

2、初始化的同时,checkscope 函数被创建,保存作用域链到函数内部的属性[[scope]]

checkscope.[[scope]] = [
  globalContext.VO
];
复制代码

3、执行checkScope 函数,创建checkScope 函数执行上下文,checkScope 函数执行上下文被压入执行上下文栈:

ECStack = [
  checkscopeContext,
  globalContext
];
复制代码

4、checkscope 函数执行上下文初始化:

1.复制函数 [[scope]] 属性创建作用域链, 2.用 arguments 创建活动对象, 3.初始化活动对象,即加入形参、函数声明、变量声明, 4.将活动对象压入 checkscope 作用域链顶端,

同时 f 函数被创建,保存作用域链到 f 函数的内部属性[[scope]]

checkscopeContext = {
  AO: {
      arguments: {
        length: 0
      },
      scope: undefined,
      f: reference to function f(){}
  },
  Scope: [AO, globalContext.VO],
  this: undefined
}
复制代码

5、执行f函数,创建 f 函数执行上下文,f 函数执行上下文被压入执行上下文栈

  ECStack = [
    fContext,
    checkscopeContext,
    globalContext
  ]
复制代码

6、f 函数执行上下文初始化, 以下跟第 4 步相同:

1.复制函数 [[scope]] 属性创建作用域链 2.用 arguments 创建活动对象 3.初始化活动对象,即加入形参、函数声明、变量声明 4.将活动对象压入 f 作用域链顶端

  fContext = {
    AO: {
        arguments: {
            length: 0
        }
    },
    Scope: [AO, checkscopeContext.AO, globalContext.VO],
    this: undefined
  }
复制代码

7、f 函数执行,沿着作用域链查找 scope 值,返回 scope 值

8、f 函数执行完毕,f 函数上下文从执行上下文栈中弹出

ECStack = [
  checkscopeContext,
  globalContext
]
复制代码

9、checkscope 函数执行完毕,checkscope 执行上下文从执行上下文栈中弹出

ECStack = [
  globalContext
]
复制代码

深入学习JavaScript系列目录

欢迎添加我的个人微信讨论技术和个体成长。

欢迎关注我的个人微信公众号——指尖的宇宙,更多优质思考干货

转载于:https://juejin.im/post/5c8b6130f265da2dd168aeff

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值