如何在 v8 中正确恢复 Javascript 上下文
How to properly restore Javascript context in v8?
我想执行以下操作:
- 使用 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;
) 被包装到函数作用域中。
相关文章:
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- javascript恢复样式
- 在文本区域禁用javascript定义的keydown事件并恢复默认行为
- 如何从本地存储恢复javascript值
- 如何在 v8 中正确恢复 Javascript 上下文
- 如何在恢复函数之前等待 JavaScript 承诺解析
- Javascript:保存和恢复浏览器窗口大小
- Javascript:保存和恢复样式状态在IE中不起作用
- Javascript:onclick函数工作一次,页面就会恢复到原来的状态
- 在IE8中恢复被覆盖的javascript方法
- 在没有F12工具的情况下恢复Internet Explorer上的javascript日志和错误
- 如何通过在javascript中单击浏览器的后退按钮将页面恢复到以前的状态
- 恢复javascript函数中的href属性
- 如何在Visual Studio代码中恢复Javascript语法错误检测
- 当条件为真时停止并恢复 Javascript 执行
- PhantomJS-暂停/恢复javascript执行
- Rhino:能够暂停、保存状态和恢复javascript
- 如何暂停和恢复javascript计时器
- 暂停和恢复 javascript 中的 setInterval
- 使用源映射恢复JavaScript缩小