Google का v8 दस्तावेज वर्णन करता है कि जावास्क्रिप्ट संदर्भ में वैश्विक फ़ंक्शन कैसे जोड़ें। हम काफी आसानी से सी ++ 11 नए लैम्ब्डा सुविधा का उपयोग कर एक printf की तरह समारोह को लागू कर सकते हैं:v8 :: फ़ंक्शन टेम्पलेट एक गैर-वैश्विक परिवर्तनीय संदर्भित करता है
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);
यह किसी भी वैश्विक जावास्क्रिप्ट समारोह है कि या तो राज्यविहीन या संदर्भ एक वैश्विक सी ++ चर के लिए अच्छी तरह से काम (यानी std::cout
) । लेकिन क्या होगा यदि हम चाहते हैं कि हमारा वैश्विक जावास्क्रिप्ट फ़ंक्शन गैर-वैश्विक C++ चर के संदर्भ में हो? उदाहरण के लिए, मान लें कि हम अपने स्वयं के वैश्विक print
फ़ंक्शन के साथ कई अलग-अलग जावास्क्रिप्ट संदर्भ बना रहे हैं जो एक अलग C++ std::ostream
का उपयोग करता है?
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 समारोह टेम्पलेट्स समारोह संकेत के बजाय std::function
वस्तुओं का इस्तेमाल किया है, तो हम कुछ इस तरह करना होगा। मुझे लगता है (उम्मीद है?) कि v8 में कुछ कार्यात्मक रूप से समकक्ष करने का एक तरीका है, लेकिन मुझे खुद को v8::FunctionTemplate
के लिए डॉक्सीजन द्वारा रहस्यमय पाया गया है। क्या कोई ऐसा व्यक्ति जिसने कुछ ऐसा करने का प्रयास किया है, तो प्रक्रिया को और अधिक समझा जा सकता है? मैं यह भी सीखना चाहूंगा कि एक जावास्क्रिप्ट ऑब्जेक्ट का वैश्विक उदाहरण कैसे बनाया जाए जो कि C++ ऑब्जेक्ट के मौजूदा, गैर-वैश्विक उदाहरण से जुड़ा हुआ है।