c++ v8 v8Function Call参数
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"));
// ...
}
``
原文地址: http://www.cveoy.top/t/topic/fEyB 著作权归作者所有。请勿转载和采集!