【问题标题】:How is callback implemented in javascript engine? (not about how to use callback)javascript引擎中的回调是如何实现的? (不是关于如何使用回调)
【发布时间】:2019-05-01 18:22:49
【问题描述】:

我知道什么是回调以及如何在 javascript 中使用回调。我的问题是javascript引擎如何? V8,实现回调?回调机制在异步事件处理中无处不在,例如事件回调,数据库查询。

它是否在一个真正的循环中?或其他形式,例如使用 select.epoll()?

如果 javascript 应用程序中有 10,000 个回调,它会减慢整个过程吗?

【问题讨论】:

  • “回调”是指异步事件处理器吗?
  • 你会想要查找“事件循环”。
  • @Bergi 是的,我更新了问题以使其更清楚。谢谢!什么事件循环?你能帮我回答这个问题吗?谢谢!
  • 如果您不知道“事件循环”是什么,那么您应该研究该术语以找到您问题的答案。
  • 关于 node.js 和 V8 引擎的详细信息,您可以查看 these threads 并点击其中的链接。

标签: javascript v8


【解决方案1】:

基本上,您的 javascript 代码被编译成一个名为 Function 的数据结构,它可以是 called 并存储在 runtime function table 中。

V8 不一定管理回调的调用或管理循环,而是确保其结构的所有执行都发生在同一个线程中,然后依赖底层引擎来管理在后台线程和事件循环中完成的工作以及调用回调。

例如,nodejs 使用libuv 作为其底层运行时功能,包括在主线程中管理the actual event loopinguv_loop_t

由于函数被调用,例如fs.readFile,它最终会分派到一个 libuv 函数中,该函数负责在后台线程中完成工作,然后最终负责管理将工作推回主事件所涉及的线程循环。

本质上,主事件循环是一个for(;;) 循环,它从队列中读取这些响应并继续,只要有后台线程保持活动状态。

浏览器的工作方式非常相似,但它们各自对相同的概念有自己的实现。

【讨论】:

  • 次要更正:JavaScript 函数表示为 JSFunction 的实例(在 src/objects/js-objects.h 中),它们不存储在表中。 “运行时函数”是一个不同的概念,它们是 V8 的 C++ 代码的特殊部分。
猜你喜欢
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多