深入学习JavaScript执行上下文

下面我将给出一份完整的攻略,帮助大家深入学习 JavaScript 执行上下文。

什么是执行上下文

在讲解如何深入学习 JavaScript 执行上下文之前,我们先来介绍一下什么是执行上下文。

在 JavaScript 中,每当代码运行到一个函数或者全局代码块的时候,都会创建一个执行上下文,用于存储当前代码执行的状态。执行上下文包含了当前环境中的变量、函数、对象等信息。 可以将其看成是一个容器,用来存储当前代码块中的所有变量、函数等信息。

JavaScript 中的执行上下文分为三种类型:

  • 全局执行上下文:当 JavaScript 代码第一次执行的时候,会创建一个全局执行上下文,它对应了整个脚本的执行环境;
  • 函数执行上下文:每当一个函数被调用的时候,都会创建一个新的函数执行上下文,它会包含这个函数中定义的所有变量、函数等信息;
  • Eval 函数执行上下文:在 eval 函数内部执行代码的时候,也会创建一个新的执行上下文。

执行上下文创建流程

当 JavaScript 代码运行到一个函数或者全局代码块的时候,会经历以下步骤来创建执行上下文:

  1. 创建变量对象(Variable Object):在函数/全局代码块中第一个被执行的操作是创建变量对象。变量对象包含了当前执行上下文中定义的所有变量和函数。

全局执行上下文中的变量对象是全局对象(即window对象),但在函数执行上下文中,变量对象是会被分成两个阶段的:

  • 创建阶段:在这个阶段,变量对象被创建,但未被初始化,函数声明也会被初始化;
  • 执行阶段:在这个阶段,变量对象被初始化,非函数声明语句也被执行。

  • 确定作用域链(Scope Chain):函数执行上下文中会创建一个作用域链,用来解析变量和函数的声明。作用域链的头部是当前执行上下文的变量对象(VO,Variable Object),尾部是全局执行上下文的变量对象。从头部到尾部依次搜索变量对象,如果找到了需要的变量,那么停止搜索,如果没有,则继续沿着作用域链向上搜索。

  • 确定 this 值:在函数执行上下文中,this 的值是在函数调用的时候确定的。

以上就是执行上下文创建的流程。

示例说明

下面来看两个示例,深入理解执行上下文的创建过程。

示例 1

var a = 10;

function foo() {
  var b = 20;
  console.log(a + b);
}

foo(); // 30

foo() 函数被调用时,会经历以下步骤来创建执行上下文:

  1. 创建变量对象(Variable Object)

js
{
arguments: {
length: 0
},
b: undefined,
this: window,
}

  1. 确定作用域链(Scope Chain)

js
Scope Chain: [VO(foo), VO(global)]

其中 VO(foo) 表示 foo() 函数执行上下文中的变量对象,VO(global) 表示全局执行上下文中的变量对象。

  1. 确定 this 值

this 的值是在执行函数时动态确定。在这个例子中,因为 foo() 函数是作为普通函数进行调用的,所以 this 的值是全局对象(即 window)。

示例 2

var a = 10;

function foo() {
  var a = 20;

  function bar() {
    console.log(a);
  }

  bar();
}

foo(); // 20

foo() 函数被调用时,会经历以下步骤来创建执行上下文:

  1. 创建变量对象(Variable Object)

js
{
arguments: {
length: 0
},
a: undefined,
bar: function() {...},
this: window
}

  1. 确定作用域链(Scope Chain)

js
Scope Chain: [VO(bar), VO(foo), VO(global)]

其中 VO(bar) 表示 bar() 函数执行上下文中的变量对象,VO(foo) 表示 foo() 函数执行上下文中的变量对象,VO(global) 表示全局执行上下文中的变量对象。

  1. 确定 this 值

this 的值是在执行函数时动态确定。在这个例子中,因为 foo() 函数是作为普通函数进行调用的,所以 this 的值是全局对象(即 window)。

以上就是两个示例对执行上下文创建流程的说明,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入学习JavaScript执行上下文 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Springboot项目快速实现拦截器功能

    针对“Springboot项目快速实现拦截器功能”,我可以提供以下完整攻略: 1. 引入依赖 在pom.xml中添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web…

    Java 2023年5月19日
    00
  • Spring MVC中使用Controller如何进行重定向

    在 Spring MVC 中,我们可以使用 Controller 进行重定向。重定向是指将用户请求重定向到另一个 URL,通常用于处理表单提交后的页面跳转。本文将详细讲解 Spring MVC 中使用 Controller 进行重定向的完整攻略,包括如何使用 RedirectAttributes 和 ModelAndView 两种方式进行重定向,并提供两个示…

    Java 2023年5月18日
    00
  • SpringBoot多数据库连接(mysql+oracle)的实现

    下面就是“SpringBoot多数据库连接(mysql+oracle)的实现”的完整攻略。 一、依赖引入 首先在pom.xml中引入mysql和oracle的jdbc依赖,以及SpringBoot的相关依赖: <dependencies> <!– mysql jdbc –> <dependency> <group…

    Java 2023年5月20日
    00
  • win2K下IIS5.0配置asp+cgi+php+mysql全攻略

    针对“win2K下IIS5.0配置asp+cgi+php+mysql全攻略”的完整攻略,我结合实际操作经验,详细阐述以下步骤和注意事项。 确认安装IIS5.0 首先,我们需要确定已经在win2K系统中安装了IIS5.0,具体步骤如下: 点击“开始”菜单,进入“设置”选项卡; 选择“控制面板”,然后点击“添加/删除程序”; 在列表中找到“添加/删除Window…

    Java 2023年5月20日
    00
  • 浅谈JAVA 线程状态中可能存在的一些误区

    浅谈JAVA 线程状态中可能存在的一些误区 简介 JAVA 线程状态是指线程对象在运行过程中所处的状态。在JAVA中,线程有6种状态,分别是新建状态、就绪状态、运行状态、阻塞状态、等待状态和结束状态。然而,对于线程状态,有一些误解是非常普遍的。本文将深入浅出地解释这些问题并给出解决方案。 误区一:线程的唤醒一定要使用notify而不能使用notifyAll …

    Java 2023年5月18日
    00
  • java关于String.split(“|”)的使用方式

    关于Java中String类的split()方法,当我们使用字符串来表示多个数据时,可以使用该方法按特定分隔符分隔字符串,并将拆分后的字符串返回为一个字符串数组。具体到您提到的使用方式:String.split(“|”),其中的 “|” 表示正则表达式中的“或”操作符,用于匹配多个字符中的任意一个。然而,这种写法需要注意 ‘|’ 在 Java 中是特殊字符,…

    Java 2023年5月27日
    00
  • 浅析JPA分类表的操作函数

    下面为您详细讲解浅析JPA分类表的操作函数的完整攻略。 简介 JPA是Java Persistence API的缩写,它是JavaEE用于ORM的标准框架,可以方便地处理Java对象与关系型数据库之间的映射关系。在JPA中,分类表(分表)是一种处理大量数据的常用技术,它将一个大表拆分为多个小表,以提高查询、更新等操作的效率。 分类表的实现方式 1. 基于En…

    Java 2023年5月26日
    00
  • 深入Ajax代理的Java Servlet的实现详解

    “深入Ajax代理的Java Servlet的实现详解”是一篇介绍如何使用Java Servlet实现Ajax代理的文章。本文一共分为以下几个部分: Ajax代理的概念及作用 Java Servlet的基础知识 使用Java Servlet实现Ajax代理的步骤 示例说明 1. Ajax代理的概念及作用 Ajax代理是一种通过服务器中转Ajax请求的技术。在…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部