iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >JavaScript中如何执行上下文和堆栈
  • 185
分享到

JavaScript中如何执行上下文和堆栈

2024-04-02 19:04:59 185人浏览 泡泡鱼
摘要

小编给大家分享一下javascript中如何执行上下文和堆栈,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是执行上下文?Ja

小编给大家分享一下javascript中如何执行上下文和堆栈,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

什么是执行上下文?

JavaScript的执行环境非常重要,当JavaScript代码在行时,会被预处理为以下情况之一:

  • Global code - 首次执行代码的默认环境。

  • Function code - 每当执行流程进入函数体时。

  • Eval code - 要在eval函数内执行的文本。

你可以阅读大量涉及作用域的在线资料,不过为了使事情更容易理解,让我们将术语“执行上下文”视为当前代码的运行环境或作用域。接下来让我们看一个包含global和function / local上下文的代码示例。

JavaScript中如何执行上下文和堆栈

这里没有什么特别之处,我们有一个由紫色边框表示的全局上下文,和由绿色,蓝色和橙色边框表示的3个不同的函数上下文。 只能有1个全局上下文,可以从程序中的任何其他上下文访问。

你可以拥有任意数量的函数上下文,并且每个函数调用都会创建一个新的上下文,从而创建一个私有作用域,其中无法从当前函数作用域外直接访问函数内部声明的任何内容。 在上面的示例中,函数可以访问在其当前上下文之外声明的变量,但外部上下文无法访问在其中声明的变量或函数。 为什么会这样呢? 这段代码究竟是如何处理的?

Execution Context Stack(执行上下文堆栈)

浏览器中的JavaScript解释器被实现为单个线程。 实际上这意味着在浏览器中一次只能做一件事,其他动作或事件在所谓的执行堆栈中排队。 下图是单线程堆栈的抽象视图:

JavaScript中如何执行上下文和堆栈

我们已经知道,当浏览器首次加载脚本时,它默认进入全局上下文执行。 如果在全局代码中调用函数,程序的顺序流进入被调用的函数,创建新的执行上下文并将其推送到执行堆栈的顶部。

如果在当前函数中调用另一个函数,则会发生同样的事情。 代码的执行流程进入内部函数,该函数创建一个新的执行上下文,该上下文被推送到现有堆栈的顶部。 浏览器将始终执行位于堆栈顶部的当前执行上下文,并且一旦函数执行完当前执行上下文后,它将从栈顶部弹出,把控制权返回到当前栈中的下一个上下文。 下面的示例显示了递归函数和程序的执行堆栈:

(function foo(i) {
if (i === 3) {
return;
}
else {
foo(++i);
}
}(0));

JavaScript中如何执行上下文和堆栈

代码简单地调用自身3次,并将i的值递增1。每次调用函数foo时,都会创建一个新的执行上下文。 一旦上下文完成执行,它就会弹出堆栈并且讲控制返回到它下面的上下文,直到再次达到全局上下文。
关于执行堆栈execution stack有5个关键要点:

  • 单线程。

  • 同步执行。

  • 一个全局上下文。

  • 任意多个函数上下文。

  • 每个函数调用都会创建一个新的执行上下文execution context,甚至是对自身的调用。

执行上下文的细节

所以我们现在知道每次调用一个函数时,都会创建一个新的执行上下文。 但是,在JavaScript解释器中,对执行上下文的每次调用都有两个阶段:

1.创建阶段 [调用函数时,但在执行任何代码之前]:

  • 创建作用域链。

  • 创建变量,函数和参数。

  • 确定“this”的值。

2.激活/代码执行阶段:

  • 分配值,引用函数和解释/执行代码。

可以将每个执行上下文在概念上表示为具有3个属性的对象:

executionContextObj = {
'scopeChain': {  },
'variableObject': {  },
'this': {}
}

激活对象/变量对象 [AO/VO]

在调用该函数,并且在实际执行函数之前,会创建这个executionContextObj。 这被称为第1阶段,即创造阶段。 这时解释器通过扫描函数传递的实参或形参、本地函数声明和局部变量声明来创建executionContextObj。 此扫描的结果将成为executionContextObj中的variableObject。

以下是解释器如何预处理代码的伪代码概述:

1.找一些代码来调用一个函数。

2.在执行功能代码之前,创建执行上下文。

3.进入创建阶段:

  • 初始化作用域链。

  • 创建variable object:

    • 对于找到的每个变量声明,在variable object中创建一个属性作为变量名称,并将该值初始化为undefined。

    • 如果变量名称已存在于variable object中,则不执行任何操作并继续扫描。

    • 对于找到的每个函数,在variable object中创建一个属性,该属性是函数的确切名称,该属性存在指向内存中函数的引用指针。

    • 如果函数名已存在,则将覆盖引用指针值。

    • 创建arguments object,检查参数的上下文,初始化名称和值并创建引用副本。

    • 扫描上下文以获取函数声明:

    • 扫描上下文以获取变量声明:

  • 确定上下文中“this”的值。

4.激活/执行阶段:

  • 在上下文中运行/解释函数代码,并在代码逐行执行时分配变量值。

我们来看一个例子:

function foo(i) {
var a = 'hello';
var b = function privateB() {
};
function c() {
}
}
foo(22);

在调用foo(22)时,创建阶段如下所示:

fooExecutionContext = {
scopeChain: { ... },
variableObject: {
arguments: {
0: 22,
length: 1
},
i: 22,
c: pointer to function c()
a: undefined,
b: undefined
},
this: { ... }
}

如你所见,创建阶段处理定义属性的名称,而不是为它们赋值,但正式的形参/实参除外。创建阶段完成后,执行流程进入函数,激活/代码执行阶段在函数执行完毕后如下所示:

fooExecutionContext = {
scopeChain: { ... },
variableObject: {
arguments: {
0: 22,
length: 1
},
i: 22,
c: pointer to function c()
a: 'hello',
b: pointer to function privateB()
},
this: { ... }
}

关于hoisting

你可以找到许多使用JavaScript定义术语hoisting的在线资源,解释变量和函数声明被hoisting到其函数范围的顶部。 但是没有人能够详细解释为什么会发生这种情况,掌握了关于解释器如何创建激活对象的新知识,很容易理解为什么。 请看下面的代码示例:

(function() {
console.log(typeof foo); // function pointer
console.log(typeof bar); // undefined
var foo = 'hello',
bar = function() {
return 'world';
};
function foo() {
return 'hello';
}
}());

我们现在可以回答的问题是:

  • 为什么我们可以在声明foo之前就能访问?

    • 如果我们理解了创建阶段,就知道在激活/代码执行阶段之前已经创建了变量。因此,当函数流开始执行时,已经在激活对象中定义了foo。

  • Foo被声明两次,为什么foo显示为function而不是undefined或string?

    • 即使foo被声明两次,我们通过创建阶段知道函数在变量之前就被创建在激活对象上了,而且如果激活对象上已经存在了属性名称,我们只是绕过了声明这一步骤。

    • 因此,首先在激活对象上创建对函数foo()的引用,并且当解释器到达var foo时,我们已经看到属性名称foo存在,因此代码不执行任何操作并继续处理。

  • 为什么bar未定义?

    • bar实际上是一个具有函数赋值的变量,我们知道变量是在创建阶段被创建的,但它们是使用undefined值初始化的。

以上是“JavaScript中如何执行上下文和堆栈”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网node.js频道!

--结束END--

本文标题: JavaScript中如何执行上下文和堆栈

本文链接: https://www.lsjlt.com/news/75275.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中如何执行上下文和堆栈
    小编给大家分享一下JavaScript中如何执行上下文和堆栈,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是执行上下文?Ja...
    99+
    2024-04-02
  • JavaScript中执行上下文和执行栈
    目录执行上下文?执行上下文的类型执行栈创建执行上下文this绑定词法环境执行上下文? 执行上下文是评估和执行JavaScript代码的环境的抽象概念。个人理解:js执行的先后顺序/函...
    99+
    2024-04-02
  • 详解JavaScript中的执行上下文及调用堆栈
    目录一、执行上下文是什么二、执行上下文栈是什么三、执行上下文栈的过程细节(一)创建阶段(二)执行阶段一、执行上下文是什么 代码运行是在一定的环境之中运行的,这个运行环境我们就成为执行...
    99+
    2024-04-02
  • JavaScript执行上下文和执行栈是什么
    本篇内容介绍了“JavaScript执行上下文和执行栈是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是执行上下文?简而言之,执行上...
    99+
    2023-06-27
  • JavaScript中的执行上下文和执行栈的概念
    本篇内容介绍了“JavaScript中的执行上下文和执行栈的概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • JavaScript执行上下文与执行栈是什么
    这篇文章主要介绍“JavaScript执行上下文与执行栈是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript执行上下文与执行栈是什么”文章能帮助...
    99+
    2024-04-02
  • 怎么理解JS栈和执行上下文
    本篇内容主要讲解“怎么理解JS栈和执行上下文”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解JS栈和执行上下文”吧! 栈栈,存储货物或供旅客住宿...
    99+
    2024-04-02
  • Javascript中的执行上下文如何创建
    这篇文章主要介绍“Javascript中的执行上下文如何创建”,在日常操作中,相信很多人在Javascript中的执行上下文如何创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Javascript中的执行上...
    99+
    2023-07-05
  • JavaScript中执行上下文和执行机制的示例分析
    这篇文章主要介绍JavaScript中执行上下文和执行机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!线程和进程说js中的执行上下文和js执行机制之前我们来说说线程和进程...
    99+
    2024-04-02
  • javascript执行上下文详解
    目录简介javascript代码的执行过程编译阶段var变量提升与let和const作用域单个执行上下文中变量的查找规则调用栈作用域链词法作用域闭包闭包的回收从上下文角度讲this简...
    99+
    2023-05-18
    javascript执行上下
  • JavaScript怎么执行上下文
    这篇文章主要介绍了JavaScript怎么执行上下文,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、怎么描述执行上下文1.1 本节知识导图:1.2 如果描述执行上下文当函数...
    99+
    2023-06-14
  • 一文聊聊Javascript中的执行上下文
    本篇文章带大家聊聊Javascript中的执行上下文,分享一个思考题,通过对思考题的分析,想必会对执行上下文有更加深入的理解。在前面的几篇文章中,我们深入了解了关于执行上下文的三个重要成员:变量对象、作用域链和 this ,本篇文章是前四篇...
    99+
    2023-05-14
    执行上下文 javascript
  • JavaScript执行上下文的概念
    这篇文章主要讲解了“JavaScript执行上下文的概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript执行上下文的概念”吧!执行上下文执...
    99+
    2024-04-02
  • JavaScript中执行上下文的示例分析
    这篇文章主要介绍JavaScript中执行上下文的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是执行上下文?JavaScript的执行环境非常重要,当JavaScrip...
    99+
    2024-04-02
  • 深入学习JavaScript执行上下文
    目录前言初始化全局对象(GO)执行上下文全局执行上下文Java Script遇到函数代码如何执行?环境变量和记录总结:前言 我们先不看这个标题,来看下面这段代码是怎么运行的: var...
    99+
    2022-11-13
    JavaScript执行上下文 JavaScript上下文
  • JavaScript中执行上下文的原理是什么
    这期内容当中小编将会给大家带来有关JavaScript中执行上下文的原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。执行上下文执行上下文是当前代码的执行环境。执行上下文主要是三种类型:全局执行上下...
    99+
    2023-06-15
  • JavaScript执行上下文中的this怎么使用
    这篇文章主要讲解了“JavaScript执行上下文中的this怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript执行上下文中的this怎么使用”吧!前言在对象内部的方...
    99+
    2023-07-05
  • 一文带你掌握JavaScript中的执行上下文和作用域
    目录执行上下文执行上下文栈变量对象全局上下文函数上下文执行过程作用域静态作用域和动态作用域作用域链函数创建总结执行上下文 我们先来看段代码 var foo = function ()...
    99+
    2023-02-08
    JavaScript执行上下文 作用域 JavaScript执行上下文 JavaScript 作用域
  • 如何深入理解JavaScript错误和堆栈追踪
    如何深入理解JavaScript错误和堆栈追踪,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。有时候人们并不关注这些细节,但这方面的知识肯定有用...
    99+
    2024-04-02
  • JavaScript 执行上下文的视角详解this使用
    目录前言全局执行上下文中的 this函数执行上下文中的 thisthis 的设计缺陷以及应对方案1. 嵌套函数中的 this 不会从外层函数中继承2. 普通函数中的 this 默认指...
    99+
    2023-02-27
    JavaScript 执行上下文 this JavaScript this
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作