簡體   English   中英

獲取v8函數的本地化“全局”范圍

[英]getting a localized “global” scope for a v8 function

我想設置一種局部作用域,該作用域將充當特定函數內部的一組全局變量,但是我想繼承所有可能已經存在的全局變量。

但是,必須有一種比我正在做的事情更簡單的方法。

我現在要做的是將要使用的作用域對象轉換為由javascript中的var聲明和賦值組成的字符串。 我將其放在返回原始函數代碼的匿名函數中,然后調用匿名函數以提供內部函數。

MAKESTRING宏使用stringstream定義字符串

std::prefix_code = convert_object_to_vars(scope);
std::code = MAKESTRING("(function() { " << prefix_code << "return (" << fdefinition << "); })()");
v8::TryCatch try_catch;
v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::NewFromUtf8(_isolate, code.c_str()));
if (try_catch.HasCaught())
    return v8::Undefined(_isolate);
if (script.IsEmpty())
    return v8::Undefined(_isolate);
v8::Local<v8::Value> result = script->Run();
if (try_catch.HasCaught())
    return v8::Undefined(_isolate);
if (!result->IsFunction())
    return v8::Undefined(_isolate);
return result

作用域變量只是一個v8 :: Object,由鍵值對組成,描述了作用域中存在的各種變量及其初始值。

convert_object_to_vars函數可以使事情變得井井有條...盡管這似乎可行,但我必須在convert函數中顯式編寫代碼以處理我要支持的每種新類型,並且當我添加更多自定義類型時,此函數就是復雜性迅速增長,因此我不認為這是一個長期解決方案。 此外,convert_object_to_vars上的許多代碼也必須在另一個函數中復制,該函數返回人類可以理解的對象表示形式。

必須有一種更簡單的方法。

我最近在開發線程池本機加載項時遇到了這個問題。

使其起作用的關鍵是使用要在函數內訪問的全局變量配置函數將在其中執行的上下文。

這需要在編譯和運行字符串化函數之前發生。 我在下面提供了一個小樣本。 myGlobalProperty將在函數內作為全局變量使用,因為它是在當前輸入的上下文中編譯並運行的。

// configure context before executing function
HandleScope scope;
Handle<Object> contextObject = Context::GetCurrent()->Global();
contextObject->Set(String::NewSymbol("myGlobalProperty"), Object::New());

// turn function into string
String::Utf8Value funcStr(functionToExecute->ToString());
string funcToExe(*funcStr);
funcToExe.insert(0, "(");
funcToExe.append(")()");

// compile and run the function
// this will execute within the currently entered and configured context
Handle<Script> functionScript = Script::New(String::New(funcToExe.c_str()));
functionScript->Run();

如果要在執行函數后訪問全局變量。 您將需要通過上下文訪問它們,如下所示:

Handle<Value> myGlobal = contextObject->Get(String::NewSymbol("myGlobalProperty"));

暫無
暫無

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

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