首页 > 其他分享 >执行上下文和调用堆栈

执行上下文和调用堆栈

时间:2024-09-26 20:12:48浏览次数:1  
标签:调用 fns 变量 作用域 ec 堆栈 scope 上下文 fn

为顶级代码创建全局执行上下文,即不在任何 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 的调用顺序无关。它根本不影响作用域链。当在当前作用域中找不到变量时,引擎会查找作用域链,直到找到所需的变量。这称为变量查找。 以上就是执行上下文和调用堆栈的详细内容,更多请关注我的其它相关文章!

标签:调用,fns,变量,作用域,ec,堆栈,scope,上下文,fn
From: https://www.cnblogs.com/aow054/p/18434235

相关文章

  • 将函数提升到 Effect-TS 选项上下文中:实用指南
    在函数式编程中,提升是指使函数适应特定上下文(例如选项)的过程。effect-ts提供了将函数提升到option上下文的便捷方法,允许您将函数或谓词无缝地应用于option值。在本文中,我们将探讨两个关键的提升函数:o.lift2和o.liftpredicate。示例1:使用o.lift2提升二元函数......
  • c#调用so
    在Linux下,.NETCore或.NET5+支持通过P/Invoke(PlatformInvoke)技术调用本地库(通常是`.so`文件)。这种方法允许您在托管的C#代码中调用非托管的C/C++代码。以下是一个简单的示例,展示如何在Linux下的C#代码中调用一个简单的`.so`库文件中的函数。###步骤1:创建......
  • Windows 系统调用
    目录xp_NtReadFile0xFFE0300h系统调用xp_KiIntSystemCallint2Ehxp_KiSystemService源码asmENTER_SYSCALLmacroEXIT_ALLmacroxp_KiSystemService源码asmSSDT结构xp_KiSystemService反编译asm快速系统调用入口方式不同xp_KiFastSystemCall反编译ASM用户空间信息保存不......
  • 开源!Pod高负载自动打印JAVA线程堆栈
    开源!Pod高负载自动打印JAVA线程堆栈运维技术探讨  2024年08月29日17:39 广东 以下文章来源于SRE运维手记 ,作者亦零一SRE运维手记.一个在房地产、家居科技、游戏和电商行业摸爬滚打的运维老司机#sre#k8s#kubernetes#prometheus#devops01背景     在......
  • celery执行异步任务并调用返回值
    @shared_task(queue='tool_invoke')deftool_invoke_task_queue(type:str,data:Union[bytes,str],path:str=None):bucket='tools'try:iftype=='image':file=download_and_convert_to_filesto......
  • Qwen2.5系列模型在GenStudio平台开源并提供API调用
    9月19日,通义千问宣布新一代模型Qwen2.5系列开源。无问芯穹Infini-AI异构云平台GenStudio目前已上架Qwen2.5-7B/14B/32B/72B,您可轻松调用模型API。快来GenStudio,加入这场Qwen2.5基础模型大派对!GenStudio模型体验地址:cloud.infini-ai.com/genstudio/model此次Qwen2.5开源......
  • unity调用java静态方法
    在Unity中调用Java静态方法通常需要通过Android插件实现。以下是基本步骤:创建Java类:在AndroidStudio中创建一个Java类,包含静态方法。packagecom.example.myplugin;publicclassMyJavaClass{publicstaticStringmyStaticMethod(){return"Hello......
  • 如何集成化管理API_方便企业内外部调用?
    API已成为企业数字战略中不可或缺的一部分。它们使不同软件系统、应用程序和服务之间能够高效、灵活地相互沟通。API不仅能提升企业内部各部门之间的协作效率,还能加强与外部合作伙伴及客户之间的互动。API的集成化管理将成为企业实现更高效业务流程的重要手段。通过有效的API管......
  • 轻松编排工作流,浅谈DolphinScheduler如何使用Python调用API接口?
    最近,在做某大型零售企业项目时,有客户用到DolphinScheduler,并咨询是否可以用Python脚本编排工作流?该如何实现?相信有很多人会有这样的疑问,那么,本文将为我们简单分享DolphinScheduler的优势和实际使用。为什么企业数据开发要使用海豚调度?当企业在做数据开发时,任务调度平台会扮演自......
  • 轻松编排工作流,浅谈DolphinScheduler如何使用Python调用API接口?
    最近,在做某大型零售企业项目时,有客户用到DolphinScheduler,并咨询是否可以用Python脚本编排工作流?该如何实现?相信有很多人会有这样的疑问,那么,本文将为我们简单分享DolphinScheduler的优势和实际使用。为什么企业数据开发要使用海豚调度?当企业在做数据开发时,任务调度平台会扮演自动......