如何理解js的执行上下文与执行栈

如何理解JS的执行上下文与执行栈

在JavaScript中,每当代码被执行时,都会创建一个称为"执行上下文"的内部数据结构。执行上下文是 JavaScript 引擎中非常重要的组成部分,它维护了变量、函数声明、作用域链等信息。本文将深入探讨什么是执行上下文以及如何通过执行栈来管理它们。

执行上下文

执行上下文(Execution Context)是一个抽象的概念,它描述了 JS 中代码被执行时的环境。每个执行上下文中包含了当前代码所需的所有信息,例如当前函数的参数、变量、对象等。在浏览器端,全局上下文可以通过 window 对象来获取。

执行上下文的创建

执行上下文有三种类型: 全局执行上下文、函数执行上下文和 eval 函数执行上下文。其中,全局执行上下文是最先被创建的,随后是函数执行上下文和 eval 函数执行上下文。每次调用函数或进入 eval 函数时,都会创建一个新的执行上下文。

以下是创建函数执行上下文的过程:

  1. 创建阶段(Creation Phase):首先 JavaScript 引擎会预处理函数体中的变量和函数声明,并分配空间给它们。同时,在创建阶段还会生成一个称为 "词法环境" 的内部数据结构,用于存储变量和函数的标识符以及它们所绑定的值。这个词法环境会根据作用域链来进行查找。
  2. 执行阶段(Execution Phase):执行阶段是实际执行代码的阶段。在这个阶段中,JavaScript 引擎会按照代码的执行顺序逐行解释执行。

执行上下文的属性

每个执行上下文都有三个重要的属性: 变量对象、作用域链和 this 值。

变量对象

在创建执行上下文时,JavaScript 引擎会创建一个称为 "变量对象" 的内部数据结构。变量对象是一个键值对的集合,用于存储当前执行上下文中的变量、函数声明等信息。

在全局执行上下文中,变量对象被设为 window 对象;在函数执行上下文中,变量对象包含了该函数的参数、函数声明以及 arguments 对象。

作用域链

在 JavaScript 中,每个函数都有自己的作用域(Scope),也就是定义变量和函数的区域。当一个函数被调用时,它的执行上下文会被加入到执行栈中,并创建一个新的作用域链。

作用域链本质上是一个指向变量对象的指针列表。它用于解析标识符,当 JavaScript 引擎需要查找一个变量或函数时,它会从当前执行上下文的变量对象开始查找,如果没有找到,则会继续向上查找作用域链中的下一个对象,直到找到为止。

this 值

this 关键字在 JavaScript 中是一个很重要的概念。它表示当前函数被调用时的上下文对象,或者说是当前函数被调用时所处的环境。

在全局执行上下文中,this 值指向 window 对象;在函数执行上下文中,this 值取决于函数被调用的方式。如果函数被作为对象的方法调用,则 this 指向该对象;如果函数被普通调用,则 this 指向全局对象。

执行栈

执行栈(

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/47337


猜你喜欢

  • 动态读取webpack打包在内存中的Bundle

    动态读取Webpack打包在内存中的Bundle 当我们使用Webpack打包前端项目时,通常会生成一个或多个Bundle文件。这些文件包含了应用程序的所有代码和资源,并被传输到客户端以供加载和执行。

    6 年前
  • npm 包 changelog 使用教程

    当你维护一个 JavaScript 项目时,很多时候你需要记录每个版本的改动。为了方便用户了解变化和开发者跟踪进展,许多项目使用 changelog 文件来记录版本历史。

    6 年前
  • npm 包 eslint-config-nodesecurity 使用教程

    前言 在编写 JavaScript 代码时,我们经常需要遵循一些编码规范和最佳实践。这不仅使代码更易于维护和理解,还可以减少潜在的安全漏洞。ESLint 是一个流行的工具,它可以帮助我们自动化执行这些...

    6 年前
  • npm 包 eslint-plugin-security 使用教程

    随着前端技术的不断发展,Web 应用程序的安全性变得越来越重要。为了提高代码的安全性和可靠性,我们可以使用一些工具进行代码检查和验证。在本文中,我介绍一个非常有用的 npm 包 eslint-plug...

    6 年前
  • npm 包 eslint-plugin-mongodb 使用教程

    在前端开发中,代码质量的保证是很重要的一部分。而 eslint 是一个常用的 JavaScript 代码检查工具,可以帮助我们自动化检查代码风格和错误,提高代码质量。

    6 年前
  • npm包parse-code-context使用教程

    在前端开发过程中,我们经常需要对代码进行分析和处理。这时候,一个好用的npm包就显得尤为重要了。parse-code-context是一个可以解析JavaScript和TypeScript代码上下文的...

    6 年前
  • npm 包 esprima-extract-comments 使用教程

    什么是 esprima-extract-comments? esprima-extract-comments 是一个 npm 包,它能够从 JavaScript 代码中提取注释。

    6 年前
  • npm 包 espree-extract-comments 使用教程

    简介 espree-extract-comments 是一个基于 Espree 的 npm 包,用于从 JavaScript 代码中提取注释。它可以方便地将注释提取为单独的对象,并支持各种类型的注释,...

    6 年前
  • npm 包 babel-extract-comments 使用教程

    babel-extract-comments 是一个 NPM 包,用于从 JavaScript 代码中提取注释。这个工具可以作为前端开发中的一个实用工具,用于生成代码文档或者提取自定义标记等。

    6 年前
  • npm 包 extract-comments 使用教程

    在前端开发过程中,我们经常需要从代码中提取注释,以便于生成文档或者做一些自动化操作。此时,npm 包 extract-comments 就能派上用场了。 安装 extract-comments 使用 ...

    6 年前
  • npm 包 array-flatten 使用教程

    当我们在前端开发中处理多层嵌套的数组时,经常需要将其展平为一维数组。这时就可以使用 array-flatten 这个 npm 包。本文将详细介绍该包的安装和使用方法,并提供示例代码。

    6 年前
  • npm 包 just-flatten-it 使用教程

    在前端开发中,我们通常需要处理多层嵌套的数据结构。而 just-flatten-it 是一个方便的 npm 包,可以将嵌套的结构展平成一维数组,从而更轻松地进行数据处理。

    6 年前
  • npm包`flatten-array`使用教程

    在前端开发中,处理数组是一个非常常见的任务。其中,将多维数组扁平化成一维数组是一个经常使用的操作。为了方便处理这个任务,我们可以使用npm包flatten-array。

    6 年前
  • npm 包 flatit 使用教程

    在前端开发中,经常会遇到需要将多层嵌套的对象转换为扁平化的格式,这时候可以使用 npm 包 flatit。该包提供了一个工具函数,可以很方便地将对象扁平化,并且支持自定义连接符、过滤函数等。

    6 年前
  • npm包validate.io-object使用教程

    介绍 在前端开发中,数据验证是一项非常重要的任务。为了提高代码的可读性和可维护性,我们通常会使用现成的npm包来进行数据验证。而validate.io-object就是其中之一。

    6 年前
  • npm 包 validate.io-nonnegative-integer 使用教程

    在前端开发中,数据的合法性验证是必不可少的一部分。其中,非负整数的验证是一个常见需求。npm 上有很多相关的包可以使用,其中一个比较好用的就是 validate.io-nonnegative-inte...

    6 年前
  • npm 包 validate.io-boolean-primitive 使用教程

    简介 validate.io-boolean-primitive 是一个用于验证 JavaScript 布尔值原始类型的 npm 包。它可以用于确保变量是布尔值,并返回相应的错误消息。

    6 年前
  • npm 包 validate.io-array 使用教程

    简介 validate.io-array 是一个 npm 包,用于验证 JavaScript 中的数组类型数据。该包提供了多种验证函数,可以帮助开发者快速判断传入的数据是否符合预期。

    6 年前
  • npm 包 const-pinf-float64 使用教程

    介绍 const-pinf-float64 是一个 npm 包,它提供了一种精确的浮点数表示方法。它通过使用 PinF 表示法来避免 JavaScript 浮点数计算时的精度误差,并在转换为字符串时生...

    6 年前
  • npm包validate.io-negative-zero使用教程

    在JavaScript中,负零是一个特殊的数字。它可以用0和-0两种形式表示,但是在进行严格相等性比较时,它们不相等。因此,当我们需要对数值进行准确的比较时,我们需要一种方法来确定一个数是否为负零。

    6 年前

相关推荐

    暂无文章