彻底弄懂 JavaScript 执行机制

yizhihongxing

彻底弄懂 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 函数的执行环境和作用域链的深入解析

    JS 函数的执行环境和作用域链的深入解析 1. 执行环境 在 JavaScript 中,执行环境是指一段可执行代码的运行环境,有全局执行环境和函数执行环境两种。 全局执行环境 全局执行环境是在浏览器中直接打开网页时就会创建的执行环境,它是最顶层的环境。全局执行环境中定义的变量和函数被称为全局变量和全局函数,它们可以在程序的任何地方被访问和修改。 示例代码: …

    JavaScript 2023年6月10日
    00
  • JavaScript reduce方法使用方法介绍

    当我们需要对数组进行一系列的计算操作时,reduce()方法就非常有用了。本篇攻略将带您详细了解JavaScript中的reduce()方法,包括使用方法、参数、返回值。 reduce()方法介绍 reduce()方法是JavaScript数组的高阶函数之一,其作用在于通过遍历数组中的所有元素并将它们累加起来,最终返回一个结果。 array.reduce(c…

    JavaScript 2023年6月10日
    00
  • JavaScript实现的CRC32函数示例

    下面是关于JavaScript实现的CRC32函数的完整攻略。 什么是CRC32函数 CRC32 (Cyclic Redundancy Check,循环冗余校验) 是一种数据校验方法,被广泛应用于网络传输、数据存储等领域。在计算机中,CRC32通常作为一种检验和函数使用,用来对数据进行完整性校验。 如何实现CRC32函数 JavaScript并没有内置的CR…

    JavaScript 2023年5月19日
    00
  • Flutter与WebView通信方案示例详解

    针对“Flutter与WebView通信方案示例详解”,我将按以下步骤来详细讲解: 简述Flutter与WebView的通信方案 示例一:Flutter通过JavaScriptChannel调用WebView中的JavaScript函数 示例二:WebView通过UrlLauncher调用Flutter函数 接下来,我将详细讲解这些内容。 1. 简述Flut…

    JavaScript 2023年5月19日
    00
  • JavaScript中的对象的extensible属性介绍

    JavaScript中的对象有一个extensible属性,它控制对象是否可以添加新的属性。如果一个对象的extensible属性被设置为false,那么它就不能添加新的属性了,一旦试图添加就会导致错误。这一特性在某些时候是非常有用的,例如需要保护一个对象不被其他代码修改时。 判断对象是否可扩展 可以使用Object.isExtensible(obj)方法来…

    JavaScript 2023年5月27日
    00
  • JS获取数组最大值、最小值及长度的方法

    获取数组最大值、最小值及长度的方法在JavaScript中非常常用,本文将详细讲解这方面的知识,步骤如下: 1. 先定义一个数组 在JavaScript中,可以通过[]或Array()函数来定义一个数组。例如: var arr = [1, 3, 5, 7, 9]; 2. 获取数组长度 获取数组长度的方法是使用数组的length属性,例如: console.l…

    JavaScript 2023年5月27日
    00
  • Javascript Array sort 方法

    以下是关于JavaScript Array sort方法的完整攻略。 JavaScript Array sort方法 JavaScript Array sort方法用于对数组中的元素进行排序。该方法会改变原始数组,即将原始数组中的元素按照指定的规则进行排序。 下面是一个使用sort方法的示例: var arr = [3, 1, 2]; console.log…

    JavaScript 2023年5月11日
    00
  • 常见JS前端接口校验方式总结

    接下来我将为您详细讲解“常见JS前端接口校验方式总结”的完整攻略。 常见JS前端接口校验方式总结 1. 基于正则表达式的校验 基于正则表达式的校验是一种常见的前端接口校验方式。 正则表达式提供了一种快速方便的方式,可以用来匹配和验证字符串格式。 比如,如果我们需要验证一个用户名是否符合规则(只包含字母和数字,长度为6~16),可以使用下面的代码: funct…

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