Google的v8文檔介紹瞭如何將全局函數添加到JavaScript上下文中。我們可以實現一個類似printf函數很容易使用新的拉姆達功能從C++ 11:v8 :: FunctionTemplate引用非全局變量
Handle<ObjectTemplate> global = ObjectTemplate::New();
global->Set(String::New("print"), FunctionTemplate::New(
[](const v8::Arguments &args) -> v8::Handle<v8::Value>
{
v8::String::AsciiValue ascii(args[0]);
std::cout << *ascii << "\n";
}));
Persistent<Context> context = Context::New(NULL, global);
這非常適用於全球任何JavaScript函數,或者是無狀態或引用全局C++變量(即std::cout
) 。但是如果我們希望我們的全局JavaScript函數引用非全局C++變量呢?例如,假設我們創建了幾個不同的JavaScript上下文,每個上下文都有其自己的全局函數print
,該函數使用不同的C++ std::ostream
?如果V8函數模板中使用std::function
對象而不是函數指針,則我們會做這樣的事:
Persistent<Context> create_context(std::ostream &out)
{
Handle<ObjectTemplate> global = ObjectTemplate::New();
global->Set(String::New("print"), FunctionTemplate::New(
[&out](const v8::Arguments &args) -> v8::Handle<v8::Value>
{
v8::String::AsciiValue ascii(args[0]);
out << *ascii << "\n";
}));
return Context::New(NULL, global);
}
不幸的是,V8似乎並不支持這一點。我認爲(希望?)v8有辦法做一些功能相當的事情,但是我發現自己被Doxygen迷住了v8::FunctionTemplate
。任何嘗試過類似事情的人都願意將流程提煉成更容易理解的東西嗎?我還想了解如何創建綁定到現有的非全局C++對象實例的JavaScript對象的全局實例。