要使用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();
如何在/path/to/my_js_functions.js文件中调用Javascript函数?
function myJsFunction(stringParam) {
return stringParam // The function returns a stringParam from the parameter
}
谢谢大家。
首先,您必须动手使用功能对象。假设它在全局范围内(在全局对象上===),您可以像这样访问它:
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);
请注意,每次获得a时MaybeLocal
,结果都可能为空,这是在引发异常时发生的。如果您不能保证不会发生这种情况,那么您不应该只使用.ToLocalChecked()
(当MaybeLocal
空为时会崩溃),而是要正确检查并处理错误情况。
一旦有了一个函数,就可以为其准备参数并调用它:
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);
同样,结果为MaybeLocal
,因为函数会抛出异常(显式或通过调用/执行所引发的操作间接引发)。由您来捕获任何错误情况,然后Cast
将结果归为适当的类型并对其进行处理。
(通过C ++ API使用JavaScript并不是一件令人愉快的事情。这主要是由于这两种语言之间在概念上存在许多差异。)
有关更多示例,请查看V8的test-api.cc。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句