深入学习JavaScript执行上下文

yizhihongxing

下面我将给出一份完整的攻略,帮助大家深入学习 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日

相关文章

  • Java8 Lambda表达式详解及实例

    Java8 Lambda表达式详解及实例 什么是Lambda表达式 Lambda表达式是Java8中引入的一个新特性,是一种轻量级的匿名函数,用来替代过往繁琐的匿名内部类编写方式。Lambda表达式可以被赋值到一个变量中,或者传递到一个方法中作为参数,像对象一样使用。Lambda表达式的语法简洁、优雅,让Java8代码的可读性和可维护性更加强大。 Lambd…

    Java 2023年5月26日
    00
  • Win10搭建Pyspark2.4.4+Pycharm开发环境的图文教程(亲测)

    下面是Win10搭建Pyspark2.4.4+Pycharm开发环境的图文教程: 环境搭建前准备 在开始搭建Pyspark2.4.4+Pycharm开发环境之前,需要先进行以下几个准备工作: 安装Java:Pyspark需要Java环境,因此需要先安装Java。可以从Oracle官网下载最新版的Java,并按照安装步骤进行安装。 安装Anaconda:Ana…

    Java 2023年5月20日
    00
  • SpringMVC适配器模式代码示例

    简介 在SpringMVC中,适配器模式用于将请求转换为处理程序方法。本文将介绍SpringMVC适配器模式的代码示例,并提供两个示例说明。 SpringMVC适配器模式 SpringMVC适配器模式是一种设计模式,用于将请求转换为处理程序方法。在SpringMVC中,适配器模式由HandlerAdapter接口和其实现类来实现。以下是一个使用适配器模式的示…

    Java 2023年5月17日
    00
  • Spring Boot的Controller控制层和页面

    Spring Boot是一个快速创建Web应用程序的框架,它提供了许多便捷的功能和工具,其中包括控制层和页面。控制层是Web应用程序的核心,它处理HTTP请求并返回响应。页面是Web应用程序的用户界面,它向用户展示数据和交互式元素。下面是详解Spring Boot的Controller控制层和页面的完整攻略: 创建控制器类 首先,我们需要创建一个控制器类来处…

    Java 2023年5月14日
    00
  • kafka生产者和消费者的javaAPI的示例代码

    以下是关于Kafka生产者和消费者JavaAPI的示例代码的完整攻略。 Kafka Kafka是一个分布式流处理平台,主要由以下组件构成: 生产者(Producer) 消费者(Consumer) 主题(Topic) 分区(Partition) 偏移量(Offset) Broker ZooKeeper Kafka的生产者和消费者JavaAPI提供了开发人员构建…

    Java 2023年5月19日
    00
  • 利用Java的Struts框架实现电子邮件发送功能

    利用Java的Struts框架实现电子邮件发送功能 在Struts框架中,可以使用JavaMail实现电子邮件的发送。下面是实现电子邮件发送的完整攻略: 步骤1:导入JavaMail和相关依赖 要使用JavaMail,需要将相关的jar包导入项目中。可以下载JavaMail的jar包和JAF(Java Activation Framework)的jar包,导…

    Java 2023年5月20日
    00
  • Springboot中@Value的使用详解

    Spring Boot中@Value的使用详解 在Spring Boot应用程序中,我们经常需要从配置文件中读取配置信息。@Value注解是Spring框架提供的一种方便的方式,用于将配置文件中的值注入到Java类中。本文将详细讲解Spring Boot中@Value的使用详解,并提供两个示例。 1. 基本用法 @Value注解可以用于将配置文件中的值注入到…

    Java 2023年5月15日
    00
  • Java中Equals使用方法汇总

    Java中Equals使用方法汇总 Equals是Java中用于比较对象的方法,常用于判断两个对象是否相等。在Java中,我们可以通过两种方式来使用Equals:覆写Equals方法和使用Objects类中的equals方法。 覆写Equals方法 覆写Equals方法是指在一个类中自定义其equals方法,这样可以根据实际需求来自定义比较方式。 Java中…

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