如何在 v8 中正确恢复 Javascript 上下文

How to properly restore Javascript context in v8?

本文关键字:恢复 Javascript 上下文 v8      更新时间:2023-09-26

我想执行以下操作:

  • 使用 v8 执行 Javascript 文件
  • 打开一个 REPL,
  • 该 REPL 在与代码完全相同的上下文中评估代码

例如,代码文件中定义的任何变量或函数都应该在 REPL 中可用。 (我会注意到这曾经适用于许多 v8 版本,但我无法弄清楚如何在当前的 v8 中让它工作(节点 0.12 == v8 3.28.73)。

我使用一个简单的类JSInterpreter,它有一个隔离和一个持久的上下文对象作为成员vars。 它们在初始化类时设置,绑定也在那时发生。

当需要解释一些代码时,我调用此方法:

Str JSInterpreter::InterpretJS (const Str &js)
{ v8::Isolate::Scope isolate_scope (isolate_);
  v8::HandleScope handle_scope (isolate_);
  //  Restore the context established at init time;
  //  Have to make local version of persistent handle
  v8::Local <v8::Context> context =
    v8::Local <v8::Context>::New (isolate_, context_);
  Context::Scope context_scope (context);
  Handle <String> source = String::NewFromUtf8 (isolate_, js . utf8 ());
  Handle <Script> script = Script::Compile (source);
  Handle <Value> result = script -> Run ();

我想一遍又一遍地调用此方法,每次,我都希望上下文包含早期调用的任何累积状态。 因此,如果代码文件(仅)包含 REPL 中的var x = 5;,我应该能够键入 > x 并查看结果5 .

但实际结果是x is not defined.

事实证明,这段代码确实按预期工作。 问题是我在运行代码之前使用的是浏览器,并且代码(例如 var x = 5; ) 被包装到函数作用域中。