彻底弄懂 JavaScript 执行机制

彻底弄懂 JavaScript 执行机制

JavaScript 的执行环境

JavaScript 代码的执行必须依赖一个执行环境,该执行环境可以是浏览器、 Node.js 服务器或其它解释器等等,而这些执行环境会为 JavaScript 提供几乎相同的对象和方法,但是在细节上或许会略有不同。

JavaScript 的执行过程

JavaScript 的执行过程可以被概括为以下三个步骤:

  1. 代码会在进入执行上下文时被编译。
  2. 编译完成后,会创建一个“执行上下文”(Execution Context)。
  3. 执行 JavaScript 代码

JavaScript 的执行上下文

执行上下文是 JavaScript 运行时环境中的一个抽象概念,用来在代码执行过程中管理代码执行过程中所需要的所有信息,包括当前上下文中的变量、对象和代码等。每进入一个新的函数或块级作用域,都会创建一个新的执行上下文,随着代码的执行,这些执行上下文也会被销毁。

执行上下文包含哪些信息?

执行上下文包含了三个重要的属性:

  1. 变量对象(Variable Object)
  2. 作用域链(Scope Chain)
  3. this 指向

变量对象(Variable Object)

变量对象是每一个执行上下文都会对应一个变量对象,其中包含了当前上下文中所定义的所有变量、函数和函数的参数。其中,函数和函数的参数在执行上下文创建时就已经确定,而变量则在代码执行过程中按需创建。

作用域链(Scope Chain)

在 JavaScript 中,每进入一个新的函数或块级作用域,都会创建一个新的执行上下文。而这些执行上下文是在创建时被封装在互相嵌套的作用域中。这些嵌套的关系就形成了作用域链,函数或变量的查找就按照这个作用域链进行。

this 指向

this 指向在 JavaScript 中非常重要,它的值取决于函数的调用方式。在函数被调用时,this 的值总是指向当前正在执行的函数。

示例说明

以下是两个 JavaScript 执行机制的示例:

例子 1

console.log(a);
var a = 1;

在上述代码中,变量 a 并没有被初始化,因此当在第一行中输出变量 a 时,其值为 undefined。当控制流程执行到第二行时,执行器会创建一个新的执行上下文,并将变量对象初始化为:

{
  a: undefined
}

再将变量 a 的值赋为 1,此时变量对象变为:

{
  a: 1
}

例子 2

function foo() {
  console.log(a);
  var a = 1;
}
foo();

在上述代码中,调用函数 foo 时,会创建一个新的执行上下文,并将变量对象初始化为:

{
  arguments: {},
  this: window,
  a: undefined
}

当控制流程执行到函数内的第二行时,变量 a 的值依然为 undefined,因此在第一行中输出变量 a 时,输出结果为 undefined。之后,再将变量 a 的值赋为 1,完成代码执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:彻底弄懂 JavaScript 执行机制 - Python技术站

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

相关文章

  • JS 中document.write()的用法和清空的原因浅析

    标题:JS 中 document.write() 的用法和清空的原因浅析 什么是 document.write() ? 在 JavaScript 中,document.write() 是一种常用的方法。它可以将文本或 HTML 代码写入到文档中。当此方法被调用时,输出的内容将被添加到 HTML 页面上当前正在解析的位置。在许多情况下,它用于在页面加载时实时生…

    JavaScript 2023年5月28日
    00
  • 详解Element-UI中上传的文件前端处理

    下面就是详解 “Element-UI中上传的文件前端处理” 的完整攻略。 一、前言 Element-UI 是饿了么前端团队开发并开源的一款基于 Vue.js 2.0 的 UI 组件库,拥有非常丰富的组件和样式,其中包含了上传文件的组件。然而,如果我们需要自定义上传文件前的处理流程,怎么做呢?本文将详细介绍 Element-UI 中上传文件前端处理的方法。 二…

    JavaScript 2023年6月10日
    00
  • JS中捕获console.log()输出的方法

    JavaScript中,我们可以使用console.log()来输出日志信息,但是如果想要将console.log()输出的内容捕获到程序中进行处理,该怎么做呢? 以下是JS中捕获console.log()输出的方法的完整攻略: 一、使用console.log重定义 首先,我们可以通过重定义console.log()方法来将输出内容重定向到我们所定义的另一个…

    JavaScript 2023年5月28日
    00
  • cookie的secure属性详解

    Cookie的secure属性详解 什么是Cookie? Cookie是一种由Web服务器存储在Web浏览器上的小文本文件。当Web浏览器向同一服务器发出请求时,会将Cookie发送回服务器。在服务器处理请求时,Cookie提供了一种追踪用户的机制,以便在多个页面或跨站点之间保持状态信息。因此,Cookie是Web应用程序的重要组成部分。 Cookie的Se…

    JavaScript 2023年6月11日
    00
  • JS下载文件|无刷新下载文件示例代码

    JS下载文件|无刷新下载文件示例代码是一种实现在前端页面中通过JavaScript代码实现下载文件的方法。下面,我将会详细讲解如何实现这个功能,过程中会提供两条示例说明。 1. 实现思路 要实现通过JS实现下载文件的功能,我们需要通过创建XMLHttpRequest对象实现文件下载。 具体的实现过程如下: 创建XMLHttpRequest对象。 通过XMLH…

    JavaScript 2023年5月27日
    00
  • JS下高效拼装字符串的几种方法比较与测试代码

    下面是关于“JS下高效拼装字符串的几种方法比较与测试代码”的攻略。 什么是拼装字符串 在 JavaScript 中,我们可以将字符串拼接起来形成新的字符串。拼接字符串的方法有很多种,其中一些方法效率比其他方法更高。 常见的拼装字符串方法 使用 + 运算符: const strA = "Hello"; const strB = "…

    JavaScript 2023年5月28日
    00
  • 关于JS字符串函数String.replace()

    那么让我们开始关于JS字符串函数String.replace()的详细讲解。 String.replace()概述 String.replace(searchValue, replaceValue)是用于将字符串中匹配某个模式的子串,替换成另一个指定的字符串。这个函数可以接受两个参数: searchValue:需要被替换的子串,它可以是一个字符串或者一个正则…

    JavaScript 2023年5月28日
    00
  • javascript 实现纯前端将数据导出excel两种方式

    当我们需要将前端的数据导出为Excel文件时,我们可以采用两种方式: 1. 使用第三方库 我们可以使用js库如FileSaver.js和xlsx.js,这两个库可以帮助我们实现导出Excel文件的功能。 1.1 安装和引入FileSaver.js和xlsx.js 你可以从libraries中下载这两个库,将他们引入到你的HTML文件内。 <script…

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