Die v8-Dokumentation von Google beschreibt, wie Sie einem JavaScript-Kontext eine globale Funktion hinzufügen. Wir können eine printf-ähnliche Funktion implementieren ganz problemlos die neue Lambda-Funktion von C++ 11 unter Verwendung von:v8 :: FunctionTemplate, das auf eine nicht globale Variable verweist
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);
Das funktioniert gut für jede globale JavaScript-Funktion, die entweder staatenlos oder Referenzen ein globaler C++ Variable (dh std::cout
) . Was aber, wenn wir möchten, dass unsere globale JavaScript-Funktion auf eine nicht-globale C++ - Variable verweist? Angenommen, wir erstellen mehrere verschiedene JavaScript-Kontexte mit jeweils einer eigenen globalen print
-Funktion, die ein anderes C++ std::ostream
verwendet? Wenn v8 Funktionsschablonen std::function
Objekte anstelle von Funktionszeiger verwendet, würde das wir so etwas tun:
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);
}
Leider v8 nicht, dies zu unterstützen scheint. Ich nehme (hoffe?) An, dass v8 einen Weg hat, etwas funktionell Äquivalentes zu tun, aber ich finde mich durch den Doxygen für v8::FunctionTemplate
mystifiziert. Würde jemand, der etwas Ähnliches versucht hat, bereit sein, den Prozess in etwas Verständlicheres zu destillieren? Ich möchte auch lernen, wie eine globale Instanz eines JavaScript-Objekts erstellt wird, das an eine vorhandene, nicht globale Instanz eines C++ - Objekts gebunden ist.