Google の v8 ドキュメントには、グローバル関数を JavaScript コンテキストに追加する方法が説明されています。C++11 の新しいラムダ機能を使用して、printf のような関数を非常に簡単に実装できます。
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);
これは、ステートレスであるか、グローバル C++ 変数 (つまりstd::cout
) を参照するグローバル JavaScript 関数でうまく機能します。しかし、グローバル JavaScript 関数が非グローバル C++ 変数を参照するようにしたい場合はどうすればよいでしょうか? たとえば、それぞれがprint
異なる C++ を使用する独自のグローバル関数を持ついくつかの異なる JavaScript コンテキストを作成しているとし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 for v8::FunctionTemplate
. 似たようなことを試みたことのある人は、そのプロセスをより理解しやすいものに要約することをいとわないでしょうか? また、C++ オブジェクトの既存の非グローバル インスタンスにバインドされた JavaScript オブジェクトのグローバル インスタンスを作成する方法も学びたいと思います。