V8 中的函数调用有两种方式:直接调用和间接调用。

  1. 直接调用

直接调用时,需要将函数对象和参数传递给'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);
  1. 间接调用

间接调用时,需要将函数对象、调用对象和参数传递给'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'));

    // ...
}
C++ V8 函数调用:直接调用和间接调用详解

原文地址: https://www.cveoy.top/t/topic/okv0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录