Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
执行上下文和调用堆栈_创想鸟

执行上下文和调用堆栈

执行上下文和调用堆栈

为顶级代码创建全局执行上下文,即不在任何 fn 内的代码。因此,首先执行 fn 之外的代码。
fn-decln/exprsn 的 fn 主体内的代码仅在调用时执行。

执行上下文(ec)

一段js执行的环境。
存储一些要执行的代码的所有必要信息,例如局部变量、传递给 fn 的 args。
js 代码始终在 ec 内运行。
无论 js 项目有多大,都只有一个全局 ec。
默认上下文,为不在任何 fn 内的代码创建。
然后代码在全局ec内部执行
顶层代码执行完毕后,执行fns并等待c/bs
对于每个 fn 调用,都会创建一个新的 ec 来执行该 fn。方法也是如此,因为它们也是附加到对象的 fns。
所有这些 ec 共同构成了调用堆栈。
当所有 fns 执行完毕后,引擎等待 cb 到达并执行它们。前任。点击事件回调,由事件循环提供。

ec里面有什么

变量环境由组成let、const、var 声明功能

arguments 对象:将传递给 fn 的所有参数存储在其 ec 中。
每个 fn 都有自己的 ec 作为其名称。声明的变量最终位于变量环境中

范围链:
fns 可以使用作用域链访问 fns 之外的变量。
包含对当前 fn 外部变量的引用并跟踪作用域链,它存储在每个 ec 中。

每个 ec 还获得 ‘this’ 关键字。

以上三个都是在执行之前的“创建阶段”生成的。这些是在顶层运行代码所必需的。

对于箭头 fns ec:

我们不会有:arguments 对象、this 关键字。箭头 fn 使用最接近的常规 fn,即上述两个。

参数:类数组对象,包含传递到常规 fn 的所有参数,而不是箭头 fn。

调用栈+内存堆=js引擎

调用栈

ec 相互堆叠的地方,以跟踪我们在执行中的位置。最顶层的 ec 是我们正在运行的 ec。当执行结束时,它会从栈顶移除,控制权会转移到底层 ec。
如果存在嵌套的 fn 调用,由于 js 只有一个执行线程,因此会暂停外层 fn 调用,以便在调用堆栈上返回内层 fn 的执行结果。现在上一个 ec 将成为活动 ec
然后最顶层的 ec 在返回时从调用堆栈中弹出。
调用堆栈中最低的将是全局 ec,最上面的将是按顺序发生的 fn 调用。
确保执行顺序永远不会丢失。
最终程序完成,全局ec也会从call stack中弹出。

js 代码在 ec 内部运行,ec 放置在 call stack 上。

hence, we can say that each ec has:1. variable environment2. scope chain3. 'this' keyword

范围界定

js 引擎如何组织和访问我们的程序变量。
变量存在于哪里
我们在哪里可以访问某些变量,哪里不能。

词汇范围:

js 具有 leical 作用域,这意味着作用域是通过代码中 fns 和块的放置来控制的。
前任。嵌套的 fn 可以访问其父 fn 的变量。

范围:

声明某个变量的空间或环境(fns 中的变量环境)。它是存储在 fns ec 中的变量 env。
对于 fns,var env 和scope 都是相同的。

three scopes in js are:1. global scope2. fn scope3. block scope [es6]

作用域是声明变量的地方。因此,对于 fns 来说也是如此,因为 fns 只是存储在变量中的值。

变量的范围

可以访问某个变量的代码区域。

作用域与变量的作用域有细微的差别。

## global scope:for top level codefor variables declared outside of any fn or block which are accessible from everywherevariables in this scope are at the top of scope chain. hence, can be used by every nested scope.
## fn scope:each fn has creates its own scopevariables are accessible only inside fn, not outside. else reference erroralso called local scopefn decln, exprsn, arrow all three create their own scopes.only way to create scope using es5 which had only fn & global scope.
## block scope:introduced in es6, not only fn but {} also create a scope known as block scope which work only for es6 variables i.e let-const types. doesn't work for variables declared with 'var' as its fn scoped.variables accessible only inside block i.e {} this only applies to variables declared with let-const only.fns are also block scoped in es6 (only in strict mode, should be used)variables declared using 'var' will be accessible outside the blockscoped to the current fn or the global scope.var variables only care about fn, they ignore blocks. they end up in nearest fn scope.

每个嵌套作用域都可以访问其外部作用域和全局作用域中的变量。同样也适用于 fn 参数。

如果 fn 在其作用域中找不到该变量,它将查找作用域链以找出其外部作用域中的变量。这个过程称为作用域链中的变量查找。反之则不行,即我们无法从 fn 或外部作用域之外访问嵌套的 fn 变量或作用域。
兄弟作用域无法访问彼此的变量
只有最内层的作用域可以访问其外层的作用域,反之则不然。

每个 fn 都有一个 ec,按照调用 fn 的确切顺序放置在调用堆栈上,其变量位于 ec 内。 global ec 位于调用堆栈的底部

范围链:
这完全取决于代码中 fns 的编写顺序。
与调用 fns 的顺序无关。
作用域链从 ec 获取变量环境。
fn 调用的顺序与作用域链完全无关。

const a = 'Alice';first();function first(){  const b = "Hello";  second();  function second(){    const c = "Hi";    third();  }}function third(){  const d = "Hey";  console.log(d + c + b + a); // Reference Error}## Call Stack order:third() EC - topsecond() ECfirst() ECglobal EC - bottomScope Chain:second() --nested inside--> first() --nested inside--> global scope.third() is independently defined inside gloabal scope.Reference Error occurred because both 'c' as well as 'b' cannot be accessed using the scope chain.

摘要:
e-c、var env、cl-sk、scope、scope-chain 都是不同但相关的概念。
范围界定询问变量存在于哪里、我们可以在哪里访问变量、在哪里不能访问变量等问题。
js 中的词法作用域:我们可以访问变量的规则完全基于代码中 fns 和块的写入位置。
每个作用域都可以访问其所有外部作用域的所有变量。这是范围链,是一条单向街道。外部作用域永远无法访问内部作用域的变量。
某个作用域的作用域链等于将所有父作用域的所有 var env 加在一起。
作用域链与 fns 的调用顺序无关。它根本不影响作用域链。
当在当前作用域中找不到变量时,引擎会查找作用域链,直到找到所需的变量。这称为变量查找。

以上就是执行上下文和调用堆栈的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1491592.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
搜索和(法学硕士)转换
上一篇 2025年12月19日 14:05:56
掌握 JavaScript 比较:从基础到高级
下一篇 2025年12月19日 14:06:10

相关推荐

  • 如何用Java实现小程序内容审核机制 Java自动化审核技术应用

    如何用Java实现小程序内容审核机制 Java自动化审核技术应用如何用Java实现小程序内容审核机制 Java自动化审核技术应用如何用Java实现小程序内容审核机制 Java自动化审核技术应用如何用Java实现小程序内容审核机制 Java自动化审核技术应用

    java实现小程序内容审核的核心是调用微信官方api(如msgseccheck、imgseccheck、mediacheckasync)进行文本、图片、音视频的合规检测;2. 后端需设计异步处理机制(如消息队列)避免阻塞,提升并发能力;3. 建立多维度审核策略,结合自建敏感词库(如ac自动机)、第三…

    2026年10月3日 • 用户投稿
    100
  • 小红书App如何分析笔记数据 小红书App后台指标的解读方法

    小红书App如何分析笔记数据 小红书App后台指标的解读方法小红书App如何分析笔记数据 小红书App后台指标的解读方法小红书App如何分析笔记数据 小红书App后台指标的解读方法小红书App如何分析笔记数据 小红书App后台指标的解读方法

    要查看小红书笔记传播效果,需进入专业号数据中心获取数据。首先打开小红书App,点击“我”进入个人主页,右上角选择“设置”,依次进入“创作者中心”或“专业号中心”,再点击“数据中心”查看整体与单篇笔记的数据报告。核心互动指标包括点赞数(反映内容认可度)、收藏数(体现实用价值)、评论数(衡量用户参与度)…

    2026年10月3日 • 用户投稿
    800
  • win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法

    win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法win11安装net3.5失败怎么办 win11.net framework 3.5离线安装方法

    答案:通过离线源、.cab包或修改注册表与服务可解决Windows 11安装.NET Framework 3.5失败问题。具体步骤依次为使用DISM命令指定ISO镜像sxs文件夹、采用.cab文件作为本地源安装,以及禁用Windows Update相关策略后重试内置功能启用。 如果您尝试在Windo…

    2026年10月3日 • 用户投稿
    200
  • 用豆包AI实现Python与数据库交互

    用豆包AI实现Python与数据库交互用豆包AI实现Python与数据库交互用豆包AI实现Python与数据库交互用豆包AI实现Python与数据库交互

    用豆包ai实现python与数据库交互的关键在于借助其生成代码和解决问题的能力。1. 豆包ai虽不能直接操作数据库,但可辅助编写连接数据库的python脚本;2. 使用时先明确数据库类型,向豆包ai请求对应模板,如“帮我写一个python连接mysql的例子”;3. 根据返回的示例代码修改配置参数以…

    2026年10月3日 • 用户投稿
    100
  • win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复

    win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复win10提示“你的电脑遇到问题,需要重新启动”_Win10蓝屏错误INACCESSIBLE_BOOT_DEVICE等问题的修复

    蓝屏“INACCESSIBLE_BOOT_DEVICE”通常因引导分区无法访问或驱动问题导致,可通过高级启动进入恢复环境,依次尝试启动修复、重建BCD引导配置、禁用快速启动与安全启动,并检查硬盘连接与硬件状态来解决。 如果您在启动Windows 10时看到“你的电脑遇到问题,需要重新启动”的错误提示…

    2026年10月3日 • 用户投稿
    400
  • xAI 正在测试 Grok 4 Fast,宣称是“地球上最快思考模型”

    xAI 正在测试 Grok 4 Fast,宣称是“地球上最快思考模型”xAI 正在测试 Grok 4 Fast,宣称是“地球上最快思考模型”xAI 正在测试 Grok 4 Fast,宣称是“地球上最快思考模型”xAI 正在测试 Grok 4 Fast,宣称是“地球上最快思考模型”

    xai 已启动 grok 4 fast 的灰度测试,并公开宣称其为“当前全球响应速度最快的思考模型”。 据官方介绍,该模型是 Grok 4 的高性能加速版本,目前已在 Grok 网页端、iOS 客户端以及 X 平台逐步向部分用户开放体验。 Grok 马斯克发起的基于大语言模型(LLM)的AI聊天机器…

    2026年10月3日 • 用户投稿
    100
  • java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​

    java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​

    一个java方法由访问修饰符、静态修饰符、返回类型、方法名、参数列表和方法体六部分组成;1. 访问修饰符决定方法的访问权限,如public、private等;2. 静态修饰符static表示方法属于类本身而非实例;3. 返回类型指定方法执行后返回的数据类型,无返回值用void;4. 方法名为调用方法…

    2026年10月3日 • 用户投稿
    100
  • win10安装net framework 3.5失败怎么办_离线安装.NET Framework 3.5教程

    win10安装net framework 3.5失败怎么办_离线安装.NET Framework 3.5教程win10安装net framework 3.5失败怎么办_离线安装.NET Framework 3.5教程win10安装net framework 3.5失败怎么办_离线安装.NET Framework 3.5教程win10安装net framework 3.5失败怎么办_离线安装.NET Framework 3.5教程

    首先使用DISM命令结合系统镜像离线安装,通过挂载ISO并指定源路径启用.NET Framework 3.5;若失败,则复制sxs文件夹到本地并用相同命令指定本地源;还可通过组策略禁用Windows Update依赖,强制使用本地源安装;最后可选用可信第三方离线包一键安装。 如果您尝试在Window…

    2026年10月3日 • 用户投稿
    000
  • PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python。编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的。所以今天根据PEP8整理了一份,以后都照此编码了,还会持续更新。 一 代码编排 1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不…

    用户投稿 2026年10月3日
    100
  • Craft CMS 元素预加载:自定义参数与 PHP 数组语法陷阱解析

    本文深入探讨了在 Craft CMS 中为预加载(Eager-Loaded)元素定义自定义参数的方法,重点解决了一个常见的 PHP 语法错误:在 with() 方法中为关联元素传递参数时,误用 JavaScript 风格的对象字面量 {} 而非正确的 PHP 数组语法 []。通过具体示例,文章演示了…

    2026年10月3日
    100
  • 解决复选框数据无法插入数据库的问题:系统化调试指南

    本文旨在解决Web应用中复选框数据无法成功插入数据库的问题。我们将深入探讨常见错误原因,并提供一套系统化的调试策略,包括利用XDebug进行代码追踪、检查PHP错误日志、直接验证数据库状态以及排查数据库连接配置,确保开发者能够高效定位并解决数据插入失败的根本原因。 理解问题:复选框数据插入失败的常见…

    2026年10月2日
    100
  • CentOS 7安装fail2ban + Firewalld防止爆破与CC攻击

    fail2ban可以监控系统日志,并根据日志中的错误信息执行相应的屏蔽操作。大多数在线教程都介绍了fail2ban与iptables的组合,但考虑到centos 7自带firewalld,并且使用firewalld作为网络防火墙更为简便,本文将介绍如何结合fail2ban和firewalld来防范暴…

    2026年10月2日
    200
  • 检测 Java 中对象是否为 Kotlin 数组

    检测 Java 中对象是否为 Kotlin 数组检测 Java 中对象是否为 Kotlin 数组检测 Java 中对象是否为 Kotlin 数组检测 Java 中对象是否为 Kotlin 数组

    本文旨在解决在 Java 代码中检测 Kotlin 数组的问题,尤其是在处理 Kotlin 注解时遇到的类型差异。通过分析 Kotlin 数组在 JVM 层的表示,以及注解代理对象的特性,提供一种可靠的检测方法,并避免常见的误判。 在 Java 和 Kotlin 混合编程环境中,处理注解时可能会遇到…

    2026年10月2日 • 用户投稿
    100
  • AI Overviews支持离线使用吗 AI Overviews离线功能说明

    AI Overviews支持离线使用吗 AI Overviews离线功能说明AI Overviews支持离线使用吗 AI Overviews离线功能说明AI Overviews支持离线使用吗 AI Overviews离线功能说明AI Overviews支持离线使用吗 AI Overviews离线功能说明

    围绕AI Overviews是否支持离线使用这一问题,本文将提供一份说明,帮助用户了解其功能特性。我们将首先简要概述AI Overviews的工作方式,然后解释为何它通常需要在线连接。最后,本文将指导您如何查找关于AI Overviews离线功能的官方信息,以便您能准确了解其当前状态和使用要求。 ☞…

    2026年10月2日 • 用户投稿
    200
  • 在Android应用中捕获并分享MPAndroidChart图表截图

    在Android应用中捕获并分享MPAndroidChart图表截图在Android应用中捕获并分享MPAndroidChart图表截图在Android应用中捕获并分享MPAndroidChart图表截图在Android应用中捕获并分享MPAndroidChart图表截图

    本教程详细介绍了如何在Android应用中,利用MPAndroidChart库的图表功能,高效地捕获BarChart(或其他支持的图表)的屏幕截图,并无需将图片永久保存到本地存储,即可通过Android的Intent机制将其无缝分享至其他社交媒体或应用。文章涵盖了从获取图表Bitmap到构建分享In…

    2026年10月2日 • 用户投稿
    500
  • 掌握MPAndroidChart图表截图与Intent分享技巧

    掌握MPAndroidChart图表截图与Intent分享技巧掌握MPAndroidChart图表截图与Intent分享技巧掌握MPAndroidChart图表截图与Intent分享技巧掌握MPAndroidChart图表截图与Intent分享技巧

    本教程详细介绍了如何在Android应用中,利用MPAndroidChart库的内置功能捕获图表(如BarChart)的屏幕截图,并结合Android的Intent机制,实现将生成的图表图片无缝分享至其他社交媒体或应用程序,整个过程无需用户手动保存图片到特定文件夹,提升用户体验和应用功能性。 在现代…

    2026年10月2日 • 用户投稿
    500
  • 解决Android PDFView重启后权限问题:一份详细指南

    解决Android PDFView重启后权限问题:一份详细指南解决Android PDFView重启后权限问题:一份详细指南解决Android PDFView重启后权限问题:一份详细指南解决Android PDFView重启后权限问题:一份详细指南

    本文旨在解决Android应用中使用PDFView库(如barteksc/AndroidPdfViewer)在设备重启后出现“Permission Denial”错误的问题。通过分析错误原因,提供代码示例和步骤,帮助开发者正确处理URI权限,确保应用在重启后仍能访问PDF文件。本文重点讲解FLAG_…

    2026年10月2日 • 用户投稿
    200
  • 解决Web部署后媒体文件播放异常:浏览器缓存与调试策略

    解决Web部署后媒体文件播放异常:浏览器缓存与调试策略解决Web部署后媒体文件播放异常:浏览器缓存与调试策略解决Web部署后媒体文件播放异常:浏览器缓存与调试策略解决Web部署后媒体文件播放异常:浏览器缓存与调试策略

    本文旨在探讨Web应用中媒体文件(如MP3、MP4)在本地开发环境正常,但部署到线上后出现播放异常的常见问题。文章将深入分析导致此类问题的原因,特别是聚焦于常被忽视的浏览器缓存机制,并提供一套系统的调试方法,帮助开发者快速定位并解决媒体资源加载失败的困境。 1. 概述:本地正常,线上异常的常见陷阱 …

    2026年10月2日 • 用户投稿
    100
  • javascript闭包怎么管理浏览器缓存

    javascript闭包怎么管理浏览器缓存javascript闭包怎么管理浏览器缓存javascript闭包怎么管理浏览器缓存javascript闭包怎么管理浏览器缓存

    闭包不能直接操作浏览器缓存,但可通过封装缓存逻辑间接影响缓存行为:1. 利用闭包维持对缓存变量的引用,实现数据的存储与检索;2. 在闭包中实现缓存过期、更新和清理策略;3. 结合http头部信息(如cache-control)决定缓存读取与更新;4. 与service worker协同实现动态缓存管…

    2026年10月2日 • 用户投稿
    100
  • javascript闭包怎么缓存DOM查询结果

    javascript闭包怎么缓存DOM查询结果javascript闭包怎么缓存DOM查询结果javascript闭包怎么缓存DOM查询结果javascript闭包怎么缓存DOM查询结果

    闭包通过保存函数创建时的词法作用域,使内部函数能持续访问外部函数中缓存的dom元素引用,从而避免重复查询。1. 创建外部函数执行一次dom查询,并将结果存储在局部变量中;2. 外部函数返回一个内部函数,该内部函数作为闭包可持久访问该变量;3. 后续调用内部函数时,直接返回已缓存的dom元素,不再执行…

    2026年10月2日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信