void cb(const FunctionCallbackInfo<Value> &args){ Isolate *isolate = args.GetIsolate(); if(!args[0]->IsNumber()){ isolate->ThrowException(v8::Exception::TypeError( v8::String::NewFromUtf8(isolate, "args[0] must be a Number"))); } if(!args[1]->IsNumber()){ isolate->ThrowException(v8::Exception::TypeError( v8::String::NewFromUtf8(isolate, "args[1] must be a Number"))); } if(!args[2]->IsFunction()){ isolate->ThrowException(v8::Exception::TypeError( v8::String::NewFromUtf8(isolate, "args[2] must be a Function"))); } Local<Function> jsfn = Local<Function>::Cast(args[2]); Local<Value> argv[2] = { Number::New(isolate,args[0]->NumberValue()),Number::New(isolate,args[1]->NumberValue())}; Local<Value> c = jsfn->Call(Null(isolate),2,argv); args.GetReturnValue().Set(c); }
上面三个判断参数类型,略过。
我们定义一个Function类型属性jsfn,将args[2]强制转换为Function并赋值给jsfn。
然后定义一个具有两个值的参数argv,这两个值就是args[0] , args[1]的数字值。
然后通过jsfn->Call(Null(isolate),2,argv)调用回调函数。
argv是一个数组,其个数我们在定义时指定,2个。
Call()方法为函数类型的值进行调用的方法。
Local< Value > | Call (Handle< Value > recv, int argc, Handle< Value > argv[])
查阅文档,可以看出,Call()方法传3个参数,第一个参数是执行上下文,用于绑定代码执行时的this,第二个参数为参数个数,第三个为参数列表,数组形式。
上面几个例子,只是冰山一角,连一角都算不上。只为了解一下nodejs使用C/C++编写原生模块,如果要编写一个可用的,高性能的C模块,那么,要求程序员一定要精通C/C++,并且对js底层也很精通,包括v8和libuv等等。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
您可能感兴趣的文章: