Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在C++;_Javascript_C++_V8 - Fatal编程技术网

Javascript 如何在C++;

Javascript 如何在C++;,javascript,c++,v8,Javascript,C++,V8,要使用v8运行一个简单的Javascript程序,我将按照以下步骤进行操作: // Create a string containing the JavaScript source code. v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "'Hello' + ', from Javascript!'", v8::NewStringType::kNormal).ToLocalChecked(); //

要使用v8运行一个简单的Javascript程序,我将按照以下步骤进行操作:

// Create a string containing the JavaScript source code.
v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "'Hello' + ', from Javascript!'", v8::NewStringType::kNormal).ToLocalChecked();

// Compile the source code.
v8::Local<v8::Script> script = v8::Script::Compile(context, source).ToLocalChecked();

// Run the script to get the result.
v8::Local<v8::Value> result = script->Run(context).ToLocalChecked();

提前感谢大家。

首先,您必须掌握函数对象。假设它位于全局对象的全局范围(=上),则可以如下方式访问它:

v8::Local<v8::String> name = v8::String::NewFromUtf8(
    isolate, "myJsFunction", v8::NewStringType::kInternalized).ToLocalChecked();
v8::Local<v8::Value> obj =
    context->Global()->Get(context.local(), name).ToLocalChecked();
if (!obj->IsFunction()) {
  /* someone overwrote it, handle error */
}
v8::Local<v8::Function> my_function = v8::Local<v8::Function>::Cast(obj);
同样,结果是一个
MaybeLocal
,因为函数可以抛出异常(显式地,或者通过调用/执行抛出异常的操作间接地)。这取决于您捕获任何错误案例,或者
Cast
将结果转换为适当的类型并对其进行处理

(通过C++ API处理JavaScript并不完全令人满意。这主要是由于这两种语言之间的许多概念上的差异)。


有关更多示例,请查看V8。

非常感谢@jmrk提供的答案。我已经看过了。但是,我不确定如何加载js文件。你能建议一下怎么做吗?我已经做了几天了。似乎没有太多关于它的文档。如果你可以,请帮助说明代码将如何流动。再次,谢谢。打开文件,你想要的任何方式(使用标准的C++设施),读取它的内容作为一个字符串,从它创建一个<代码> V8::String < /C> >,并将它传递给<代码> V8::Script::编译< <代码> >代码>运行< /Cord>。如果您想学习一个示例:下面是
d8
shell如何实现其
load
命令:谢谢@jmrk。我无法表达我的感激之情。它起作用了!再次感谢你的帮助。
v8::Local<v8::String> name = v8::String::NewFromUtf8(
    isolate, "myJsFunction", v8::NewStringType::kInternalized).ToLocalChecked();
v8::Local<v8::Value> obj =
    context->Global()->Get(context.local(), name).ToLocalChecked();
if (!obj->IsFunction()) {
  /* someone overwrote it, handle error */
}
v8::Local<v8::Function> my_function = v8::Local<v8::Function>::Cast(obj);
v8::Local<v8::Value> receiver = ...;
int argc = ...;
v8::Local<v8::Value> args[argc] = ...;
v8::MaybeLocal<v8::Value> result = my_function->Call(context.local(), receiver, argc, args);