簡體   English   中英

如何在v8中正確還原Javascript上下文?

[英]How to properly restore Javascript context in v8?

我要執行以下操作:

  • 用v8執行Javascript文件
  • 打開一個REPL,它在與代碼完全相同的上下文中評估代碼

例如,代碼文件中定義的任何變量或函數都應該在REPL中可用。 (我會注意到它以前曾在許多v8版本上運行,但我不知道如何在當前v8上運行它(節點0.12 == v8 3.28.73)。)

我使用一個簡單的類JSInterpreter,該類具有一個隔離對象和一個持久性上下文對象作為成員變量。 它們在類初始化時設置,並且綁定也同時發生。

當需要解釋一些代碼時,我調用此方法:

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

我想一遍又一遍地調用此方法,每次,我都希望上下文包含早期調用中的任何累積狀態。 因此,如果代碼文件包含(僅) var x = 5; 在REPL上,我應該能夠輸入> x並查看結果5

但是實際結果是x is not defined

事實證明,此代碼實際上按預期運行。 問題是我在運行代碼之前使用過browserify,並且代碼(例如var x = 5; )被包裝到函數范圍中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM