【发布时间】:2020-09-11 12:11:05
【问题描述】:
我试图更好地理解当 V8 引擎解析代码并为函数定义执行上下文时究竟发生了什么。
大多数 JS 课程和书籍通常讨论的是在“创建阶段”和“执行阶段”发生的事情。 JS引擎使用的语言不同:预解析、解析、AST、基线和优化编译。
根据我目前的阅读理解,虽然我可能非常错误,但“创建阶段”与预解析源代码相同,其中解析器在变量和函数方面做的最少声明以便代码可以运行。例如,在代码中调用函数之前,它不会尝试为函数构建 AST。当从全局范围调用一个函数时,它将被预解析(创建阶段),然后完全解析(执行阶段)。在预解析期间将创建一个具有词法环境等的新执行上下文。然后将对每个嵌套函数重复此过程。
问题 1:我的假设是否正确?正在预解析===创建阶段。 问题2:这是我最不清楚的一点。预解析是否为尚未调用的函数创建函数对象。就是下面调试器的Chrome开发工具中显示的函数对象,实际上是单独基于预解析创建的。参数和调用者属性是否只是在后续执行阶段更新。
let fun1 = function(name){
let newname="Tom";
console.log(name, newname);
};
debugger
fun1("John");
//fun1 函数在它被调用之前出现在开发工具中(并且可能在它被添加到执行堆栈之前) 脚本 fun1:ƒ(名称) 参数:空 来电者:空 长度:1 名称:“乐趣1” 原型:{构造函数:ƒ} 原型:ƒ ()
//fun1函数被调用后加入执行栈。 当地的 名称:“约翰” 新名称:未定义 这个:窗口 脚本 fun1:ƒ(名称) 参数:参数 [“John”,被调用者:ƒ,符号(Symbol.iterator):ƒ] 来电者:空 长度:1 名称:“乐趣1” 原型:{构造函数:ƒ} 原型:ƒ ()
【问题讨论】:
-
“创建阶段”是指在函数调用期间创建变量范围。它与“(预)解析”完全无关。
标签: javascript parsing v8