C++ V8 函数调用:直接调用和间接调用详解
V8 中的函数调用有两种方式:直接调用和间接调用。
- 直接调用
直接调用时,需要将函数对象和参数传递给'v8::Function::Call()'方法。参数可以是'v8::Value'类型的任意值,包括简单类型(如整数、字符串等)和复杂类型(如对象、数组等)。
例如:
// 创建函数对象
v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(context->Global()->Get(v8::String::NewFromUtf8(isolate, 'myFunc')));
// 设置参数
v8::Handle<v8::Value> args[2];
args[0] = v8::Integer::New(isolate, 123);
args[1] = v8::String::NewFromUtf8(isolate, 'hello');
// 调用函数
v8::Handle<v8::Value> result = func->Call(context, context->Global(), 2, args);
- 间接调用
间接调用时,需要将函数对象、调用对象和参数传递给'v8::Object::CallAsFunction()'方法。调用对象可以是任意类型的对象,而不仅仅是函数对象。
例如:
// 创建调用对象
v8::Handle<v8::Object> obj = v8::Handle<v8::Object>::Cast(context->Global()->Get(v8::String::NewFromUtf8(isolate, 'myObj')));
// 创建函数对象
v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(obj->Get(v8::String::NewFromUtf8(isolate, 'myFunc')));
// 设置参数
v8::Handle<v8::Value> args[2];
args[0] = v8::Integer::New(isolate, 123);
args[1] = v8::String::NewFromUtf8(isolate, 'hello');
// 调用函数
v8::Handle<v8::Value> result = obj->CallAsFunction(context, obj, 2, args);
注意:在间接调用中,调用对象和函数对象的作用域是不同的。如果需要在函数中使用调用对象的属性或方法,可以将调用对象作为函数的第一个参数传递进去。例如:
// 创建调用对象
v8::Handle<v8::Object> obj = v8::Handle<v8::Object>::Cast(context->Global()->Get(v8::String::NewFromUtf8(isolate, 'myObj')));
// 创建函数对象
v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(obj->Get(v8::String::NewFromUtf8(isolate, 'myFunc')));
// 设置参数
v8::Handle<v8::Value> args[2];
args[0] = obj;
args[1] = v8::Integer::New(isolate, 123);
// 调用函数
v8::Handle<v8::Value> result = func->Call(context, context->Global(), 2, args);
在函数中,可以使用'args[0]'来访问调用对象的属性或方法。例如:
void MyFunc(const v8::FunctionCallbackInfo<v8::Value>& args) {
// 获取调用对象
v8::Handle<v8::Object> obj = v8::Handle<v8::Object>::Cast(args[0]);
// 获取参数
int num = args[1]->Int32Value();
// 访问调用对象的属性
v8::Handle<v8::Value> value = obj->Get(v8::String::NewFromUtf8(isolate, 'myProp'));
// ...
}
原文地址: https://www.cveoy.top/t/topic/okv0 著作权归作者所有。请勿转载和采集!