ð可视化:JavaScript中的执行上下文
#javascript #初学者 #编程 #visualization

当JavaScript在浏览器中运行时,需要将其转换为机器代码,因为它无法直接理解它。当浏览器的JavaScript引擎遇到JavaScript时,它会为其创建一个特殊的环境,其中处理我们编写的JavaScript代码的“翻译”和执行。此环境称为执行上下文。

在本文中,我将在视觉上尽我所能地解释它的工作原理。

执行上下文可以具有全局范围和函数范围。首次JavaScript开始运行,它创建了一个全局范围。

接下来,将JavaScript解析,并将变量和函数声明保存到内存中,以稍后将用于执行不同的函数。
最后,在使用保存在内存中的变量的位置执行代码。

全局和函数执行上下文之间的差异

如上所述,当JavaScript引擎首次遇到JavaScript时,它会创建默认的执行上下文,该默认执行上下文是全局的,任何不在函数内部的内容。
当引擎遇到函数时,它将创建另一个执行上下文,称为函数执行上下文,在其中执行位于函数内部的代码。
重要的是要注意,对于每个脚本文件,只有一个执行上下文,对于函数执行上下文也是如此。

如何创建执行上下文?

执行上下文有两个阶段:

  1. 创建阶段
  2. 执行阶段

Execution context phases

创建阶段

创建阶段有3个阶段。在此阶段,执行上下文与执行上下文对象关联,该对象定义为此对象的属性。

  1. 创建变量对象
  2. 创建范围链
  3. 设置此值

Creation phase

1ïߣ变量对象
变量对象是一个类似对象的容器,可在当前执行上下文中存储变量和函数声明。
每次我们使用关键字var创建变量时,它都会添加到变量对象中,作为指向变量的属性,但它并不随之而来,只有声明。

在此变量对象环境中,分配给变量的值不确定。还记得控制台日志的第一个示例吗?这就是为什么我们看到了不确定的输出。

The variable object

当我们使用关键字制作变量时,Let and const过程几乎相同,但在技术上有些不同。我们有一个词汇对象环境,而不是可变对象环境。在技​​术上,变量对象也是专门用于var关键字的词汇环境。
那么,用const和let声明的变量会发生什么呢?它们也保存在词汇环境对象中,但没有未定义的对象,它们的默认值是非初始化的。

The variable object

最后,如果您记得,我还提到执行上下文保存函数声明。正如变量不与分配的值同时一样,函数也适用。它不是整个函数,它的默认值是对此函数的引用。

The variable object

当我提到功能时,请注意,这与函数表达式无效,因为我们将函数保存在变量中,并且它将保存为变量,无论是VAR,LET还是CONST。
在执行前存储在内存中存储变量和函数声明的过程称为提升,下次我们将更详细地讨论。

2ﶣ范围链
JavaScript中的范围是一个框功能,该功能确定位于其外部的变量是否可以访问。我们具有诸如全局范围,功能范围和块范围之类的范围。用VAR声明的变量被全局划分和函数分配,而Let and and and and const是函数分组和块分布的。我已经写了一篇有关变量如何在不同范围中起作用的文章。

The scope

正如我们上面已经提到的,我们还具有函数执行上下文,该上下文是根据函数保留和每个函数执行上下文创建的。此外,即使我们在函数中具有多个函数,其他函数中的功能也可以访问父函数中的所有内容。但是,如果父函数被函数划分,则父函数可能无法访问子范围中的变量。

lexical scope

行为的类型称为词汇范围。这不起作用。这意味着父函数无法检索其子函数中声明的变量,因为它们是函数分配的。
范围之间的这种链接称为范围链。这就像一个Matryoshka娃娃又名堆叠洋娃娃,每个洋娃娃都嵌套了另一个洋娃娃。这意味着内娃娃可以访问外部娃娃变量,但外部娃娃无法访问洋娃娃。这意味着范围链一直从内部范围开始。

The scope chain

3ïˆ 设置此值
完成范围链后,下一步就是设置此关键字的值。此关键字是指当前执行上下文的范围。
在我们具有全局范围的执行上下文中,这是指全局对象窗口。因此,我们用VAR声明的任何内容,无论是函数还是变量都属于窗口对象,并将其附加为属性或方法。

Setting the this value

但是在函数执行上下文中会发生什么?
函数中的函数执行上下文取决于其如何调用。如果在全球环境中调用它,因此我们通常会这样做,此关键字将引用全局窗口,因此定义了它的环境。
您认为每个功能的输出将是什么?

The scope chain

每个人都会登录相同的件 - 苹果,因为它们都指我们水果所在的全局窗户对象。
但是,如果我们将函数用作对象的方法怎么办?

The scope chain

在这种情况下,并非所有控制台日志都会显示一个苹果。最后一个将是橙色。为什么?因为此关键字将引用此对象的内部对象上下文。这意味着对象的当前上下文与全局范围分开,因此它指的是位于对象Myobj内部的果实。

执行阶段

完成创建阶段的所有三个阶段后,JavaScript引擎将再检查变量对象并开始分配值以继续执行代码。

Execution phase

接下来,让我再提醒您有关执行上下文的一次。当JavaScript被解析时,第一个执行上下文是在全局范围中创建的。接下来,当我们创建对象或函数时,为每个函数创建另一个函数执行上下文。因此,您将拥有其他函数执行上下文,因为您拥有的功能或对象也是如此。因此,请想象我有5个功能,这意味着我有5个函数执行上下文。所有这些执行上下文都堆积为执行堆栈。
现在,关于JavaScript的另一个重要事情,我知道它永远不会结束,哈哈。

javaScript是一种单线程语言,这意味着几个动作不能在相同的情况下执行。
创建函数执行上下文时:

  1. 转到当前正在执行的执行上下文的顶部
  2. 此执行在执行堆栈的顶部
  3. 并成为主动执行上下文

因此,因此,主动执行上下文是将执行第一个的上下文。

然后是另一个活跃的活动,然后被执行第二,依此类推。

注意:执行堆栈也称为呼叫堆栈。

让我们尝试可视化过程

Execution stack

最后,当所有函数执行时,全局执行上下文将从执行上下文aka aka aka删除。

结论

总而言之,了解执行环境在JavaScript中的工作方式对于制定有效有效的代码至关重要。每当JavaScript引擎遇到代码时,都会创建一个称为执行上下文的特殊环境,该环境可以具有全局范围或函数范围。在创建阶段,设置了变量对象,范围链和此关键字,在执行阶段,执行代码。此外,使用VAR,LET和CONST用于可变声明,功能吊装和范围链确定函数内外变量的可访问性。
如果它仍然让您感到困惑,我建议您不要担心太多,然后慢慢地尝试一个人理解它。我花了几个小时尝试详细了解所有这些,但我仍然知道我没有涵盖所有内容,也许我没有完全解释一切的工作原理。无论如何,阅读此类细节是一次很棒的经历,我越来越近!
我也没有像吊装那样详细介绍很多东西,但是稍后我会回到它。

ð这对您有任何帮助吗?请让我知道