用C/C++来实现 Node.js 的模块(二)_node.js(3)
后面两个参数就不多说了,一个是参数个数,另一个就是一个参数的数组了。至于第一个参数 Handle<Object> recv,StackOverflow 仁兄的解释是这样的:
It is the same as apply in JS. In JS, you do
var context = ...;
cb.apply(context, [ ...args...]);
The object passed as the first argument becomes this within the function scope. More documentation on MDN. If you don't know JS well, you can read more about JS's this here: http://unschooled.org/2012/03/understanding-javascript-this/
—— 摘自 StackOverflow
总之其作用就是指定了被调用函数的 this 指针。这个 Call 的用法就跟 JavaScript 中的 bind()、call()、apply() 类似。
所以我们要做的事情就是先把参数表建好,然后传入这个 Call 函数供其执行。
第一步,显示转换函数,因为本来是 Object 类型:
Local<Function> cb = Local<Function>::Cast(args[0]);
第二步,建立参数表(数组):
Local<Value> argv[argc] = { Local<Value>::New(String::New("hello world")) };
最后调用函数系列
调用 cb ,把参数传进去:
cb->Call(Context::GetCurrent()->Global(), 1, argv);
这里第一个参数 Context::GetCurrent()->Global() 所代表的意思就是获取全局上下文作为函数的 this;第二个参数就是参数表中的个数(毕竟虽然 Node.js 的数组是有长度属性的,但是 C++ 里面数组的长度实际上系统是不知道的,还得你自己传进一个数来说明数组长度);最后一个参数就是刚才我们建立好的参数表了。
终章之结束文件系列
相信这一步大家已经轻车熟路了吧,就是把函数写好,然后放进导出函数里面,最后申明一下。
我就直接放出代码吧,或者直接跑去 Node.js 的文档看也行。
#include <node.h>
using namespace v8;
Handle<Value> RunCallback(const Arguments& args)
{
HandleScope scope;
Local<Function> cb = Local<Function>::Cast(args[0]);
const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value>::New(String::New("hello world")) };
cb->Call(Context::GetCurrent()->Global(), argc, argv);
return scope.Close(Undefined());
}
void Init(Handle<Object> exports, Handle<Object> module)
{
module->Set(String::NewSymbol("exports"),
FunctionTemplate::New(RunCallback)->GetFunction());
}
NODE_MODULE(addon, Init)
Well done! 最后剩下的步骤就自己去吧。至于 Js 里面这么调用这个函数,我在之前已经提到过了。
番外
嘛嘛,我感觉我的学习笔记写得越来越奔放了求破~
今天就先写到这里吧,写学习笔记的过程中我又涨姿势了,比如说那个 Call 函数的参数意义。
如果你们觉得本系列学习笔记对你们还有帮助的话,就来和我一起搞基吧么么哒~Σ>―(〃°ω°〃)♡→