gpt4 book ai didi

javascript - V8什么时候开始编译并执行与事件循环堆栈相关的代码?

转载 作者:行者123 更新时间:2023-12-01 01:27:00 24 4
gpt4 key购买 nike

我一直很好奇js代码从头到尾是怎么执行的。

我读过有关事件循环的内容并看到了这个 great video ,堆栈帧看起来如何 here ,并了解V8引擎如何编译js代码here .

问题:

V8什么时候开始编译并执行与事件循环堆栈相关的代码?

是函数即将出栈的时候吗?

或者所有函数在放入堆栈之前都会被编译吗?

因此将其他函数放在顶部的过程实际上只是处理机器代码,如果是这样,从堆栈中弹出该函数时是否会执行该机器代码?

如果我的问题不被理解,我相信通过这个例子会更好地理解

示例:

function foo() {
var name=`foo`;
var obj = {
number: 6
}
console.log(obj.number);
}

function baz() {
var name = `baz`;
console.log(a);
foo();
}

baz();
  1. 发生的第一个进程是 lazy parsing ,其中所有文件都被解析语法错误,但没有完全解析,因此需要更少的时间。
  2. 查看函数减速

    • v8 引擎现在是否将函数声明代码编译为机器码?或者还没轮到他..
  3. baz 被调用,baz 被放置在堆栈底部,并且在其堆栈帧中存储名称变量值(因为它是原语)。

    • buz 到底什么时候被解析并转换为机器代码?在将其放入堆栈之前?或者当它弹出时?
  4. console.log 放置在 baz 之上并执行, - 控制台显示 baz

    • 这是console.log js代码被编译为机器代码并执行的地方?
  5. console.logs 堆栈的弹出消息。

  6. foo 放置在 baz 之上,obj 放置在堆中(因为它是引用类型),name=foo 放置在 foo 的堆栈帧中。

  7. console.log 位于 foo 之上,并执行,控制台显示 6。

  8. console.log 弹出。
  9. foo 及其局部变量值弹出。
  10. baz 与其 name=baz 局部变量一起弹出

最佳答案

不存在“事件循环堆栈”这样的东西。

一个概念是“调用堆栈”,该术语表示当函数相互调用时,它们形成类似堆栈的当前状态。这主要是一个理论概念,但事实上,确实有一个称为“堆栈”的内存区域,用于函数的局部变量,但它不是具有推送/弹出接口(interface)的数据结构:调用函数的行为将其数据放置在该堆栈上,从函数返回时会再次删除它,将控制权返回给调用函数。

这回答了函数的一部分:开始执行函数实际上与将此函数放置在调用堆栈上完全相同。这是对同一事物的两种描述。

另一个概念是事件队列。你可以把它想象成一个等待执行的函数队列;每当没有其他函数正在执行时,就会调用该队列中的下一个函数。将函数放入队列不需要它已被解析或编译。在您的示例代码片段中,根本没有使用事件队列。

编译函数实际上与这一切无关。当一个函数被调用时(由另一个函数或事件循环),它必须以某种形式可执行——但根据你的 JavaScript 引擎,它可以在没有任何编译的情况下被解释,或者它可以被编译为字节码,或者它可以被编译为机器代码,或者引擎可以利用这个机会从一种切换到另一种。

既然您具体询问了 V8:在当前版本中,当 V8 看到像 function f() { ... } 这样的函数定义时,它还不会执行任何操作(除了在少数情况下,V8 猜测该函数将很快执行,在这种情况下,它会立即为其创建字节码)。如果函数作为回调排队,仍然不会发生解析或编译。当第一次调用函数时,V8 会为其创建字节码。当再次调用该函数时,字节码已经存在,因此不需要额外的工作。当一个函数运行得足够热时,V8 最终决定为其编译优化的机器代码,通常是在后台线程上。对它的额外调用是 V8 检查后台线程是否已经完成生成机器代码的机会;如果是这样,那么下一次调用将使用优化后的代码,而不是像之前的调用那样解释函数的字节码。请注意,这些实现细节可能并且将会随着时间的推移而改变。

还有一个需要澄清的注释:

in its stack frame the name variable value is stored (since its a primitive).

不完全是。 变量本身存储在堆栈帧中,但仅作为引用。它是否引用原始值并不重要;字符串和对象都在堆上分配。当函数返回并且其栈帧被拆除时,局部变量将被销毁;堆上的相应对象或字符串将(最终,在某个不确定的时间)被垃圾收集器清理。

关于javascript - V8什么时候开始编译并执行与事件循环堆栈相关的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53686453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com