什么是属于单个隔离的多个V8上下文对象的共享/离散?

xax*_*xon 8 javascript v8

我理解v8 :: Isolate的想法,我理解运行的所有内容都在与隔离相关联的v8 :: Context中运行.与不同分离株相关的上下文不能共享任何内容.

我的问题是,在一个孤立中有多个上下文是什么意思?在上下文之间共享什么?什么是他们之间的离散?什么时候可以在一个东西中制作东西并在另一个中使用它?通常在API中,如果某些东西在创建它时需要隔离或上下文,它似乎几乎是任意的.

此外,欢迎任何关于在单个隔离中使用多个上下文的案例的建议,以帮助我更好地理解它们.

我看到这个问题:v8 :: Isolate和v8 :: Context之间究竟有什么区别?但它并没有详细说明你如何/为什么在一个孤立中使用多个上下文.

谢谢.

xax*_*xon 3

我从邮件列表中得到的信息是,除了函数之外,几乎所有内容都可以在同一个隔离区中跨上下文共享。

这取决于安全策略。默认情况下,一切都是共享的。

您可以使用 v8::ObjectTemplate::SetAccessCheckCallback() 打开访问检查,以阻止基于每个属性的访问,或者通过使用 v8::Context::SetSecurityToken() 更改安全令牌来完全禁止共享。

旁白:我相信您需要将上下文传递给 v8::Object::Set() 的原因是为了消除重载函数的歧义。C++ 不允许仅重载返回类型。

它也稍微快一些。Set() 的无上下文版本查找当前上下文并调用上下文化的 Set()。

定义“一切”?我可以使用任何 javascript 程序并获取每一行并在不同的上下文中(在同一个隔离上)运行它并且它会工作吗?至少从理论上来说,程序没有发生根本性的改变?

不完全的。V8 中的基本执行单元是函数。函数属于编译它们的上下文。