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

时间:2015-03-13 00:20:14

标签: javascript v8

我想做以下事情:

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

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

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

在解释某些代码的时候,我称这种方法为:

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 ();

我想把这种方法称为&amp;重复,每次,我希望上下文包含早期调用中的任何累积状态。因此,如果代码文件在REPL中包含(仅)var x = 5;,我应该能够键入> x并查看结果5

但实际结果是x is not defined

1 个答案:

答案 0 :(得分:0)

事实证明,此代码实际上按预期工作。问题是我在运行代码之前使用了browserify,并且代码(例如var x = 5;)被包装到函数范围中。