首页 > 其他分享 >函数调用栈-执行上下文栈

函数调用栈-执行上下文栈

时间:2023-10-17 09:46:00浏览次数:38  
标签:上下文 console 函数 函数调用 词法 p1 执行

一 调用栈
我们知道栈的特点是,先进后出的。那么函数的执行上下文栈又是怎么样的呢?
先看这段代码

var a = 2

function p2(b,c){
return b+c;
}

function p1(b,c){
var d = 10;
result = p2(b,c);
return a + result + d;//2+9+10
}

console.log(p1(3,6));//21

由于js代码是 运行时编译,先进行词法解析、语法解析 生成AST(抽象语法树)生产、代码生成- 生成机器码(运行在浏览器上)。而在词法解析阶段,就会生成执行上下文。所以 js 的作用域 又叫 词法作用域。也就是说,js作用链查找与函数在哪里执行没有关系,而与函数在哪里定义有关系。
分析上面代码调用栈执行过程。

  1. 浏览器编译这段js代码,在词法解析阶段,创建全局执行上下文

  2. 执行全局js代码
    将 2赋值给a,这儿用到了 lfs查询,查询到a的内存地址,并将 2 存入 该地址中。
    查询console.log 函数并执行该函数(由于console.log 的执行上下文没有什么意义,故省略)
    查询p1函数并编译p1函数(词法解析阶段 生成 p1的执行上下文,并压入执行上下文栈中)

注: 第张图有两处错误。
。 result 由于没有 使用 var定义,在p1的作用域中查询不到,会被定义到window上,不应该在 p1 函数执行上下文的变量环境中。
。还有,这儿p1函数有形参传值,在编译p1函数的 词法解析阶段 也会进行 b 和 c 的声明,这儿在图2中也没有体现。

p2 执行完毕,返回 3+6 等于9的值,p2函数执行上下文出栈。
函数p1中 ,将9赋值给 result变量;返回 a+ resutl+d 值(这三个都执行 rls查询,将查询结果相加);p1函数执行完毕,p1函数执行上下文出栈。将p1函数返回值传入console.log 的形参,执行 console.log 函数。

标签:上下文,console,函数,函数调用,词法,p1,执行
From: https://www.cnblogs.com/honkerzh/p/17768942.html

相关文章

  • cpu在执行 java时,java指令是保存在数据cache中还是指令cache中
    Java代码在运行时,首先由JVM(JavaVirtualMachine)编译器将Java字节码转换成本地机器代码,然后再由CPU执行。在CPU中,指令缓存(InstructionCache)和数据缓存(DataCache)都是用于提高CPU处理效能的缓存结构,它们是处理器访问内存的缓存。对于生成的代码(或者说指令),它会被放入指令缓......
  • java批量执行atax同步MySQL表时出现卡住问题处理
    中断问题和datax中自带的MySQLjar包版本有关,更换后即可。背景:有个需求需要把服务器上的mysql业务库数据同步到另一台服务器上,我选择了datax来做批量同步操作。现象:java批量执行的代码写好后,在自己电脑(win10)执行没问题,换了一台电脑(也是windowsserver2019),报以下错误://执行以......
  • 关于django中间件执行过程
    众所周知,django的中间件一般有五个方法,常用的仅三个,示例如下fromdjango.utils.deprecationimportMiddlewareMixinfromdjango.httpimportHttpResponse中间件示例classMyMiddleWare(MiddlewareMixin): defprocess_request(self,request): pass defprocess_view(se......
  • 程序并发执行和前驱图
         ......
  • Mysql SELECT 语句执行过程
    整个SELECT语句查询流程1、客户端/服务端通信协议(Connectors)Mysql客户端/服务端通讯协议是半双工的,这就意味着在任意时刻只能有一端能发送数据,要么是客户端向服务端发送数据,要么是服务端向客户端发送数据,这两个动作不能同时进行,一旦一端开始发送数据,另外一端要完整......
  • 【分享】讯飞星火认知大模型Python调用上下文测评
    一个很常用的用法,先是system提示,然后是user问题{"role":"system","content":"假设你是个程序员,你的微信是xxxxxxxx"},{"role":"user","content":"微信多少"}openai测试importopenai#pipinstallopenaiop......
  • 【分享】百度千帆大模型Python调用上下文测评
    一个很常用的用法,先是system提示,然后是user问题{"role":"system","content":"假设你是个程序员,你的微信是llike620"},{"role":"user","content":"微信多少"}openai测试importopenai#pipinstallopenaiope......
  • 【分享】讯飞星火认知大模型Python调用上下文测评
    一个很常用的用法,先是system提示,然后是user问题{"role":"system","content":"假设你是个程序员,你的微信是llike620"},{"role":"user","content":"微信多少"}openai测试importopenai#pipinstallopenaiope......
  • cefsharp 执行 js 并返回结果
    privateasyncvoidbutton1_Click(objectsender,EventArgse){varresponse=awaitbrowser.EvaluateScriptAsync("document.title");if(response.Success)MessageBox.Show(response.Result?.ToString());response=awaitbrowser.......
  • Spring远程命令执行漏洞(CVE-2022-22965)原理研究
    一、前置知识SpringMVC参数绑定为了方便编程,SpringMVC支持将HTTP请求中的的请求参数或者请求体内容,根据Controller方法的参数,自动完成类型转换和赋值。之后,Controller方法就可以直接使用这些参数,避免了需要编写大量的代码从HttpServletRequest中获取请求数据以及类型转换。这个......