用C/C++来实现 Node.js 的模块(二)
首先请大家记住这个 V8 的在线手册——http://izs.me/v8-docs/main.html。
还记得上次的 building.gyp 文件吗?
http://izs.me/v8-docs/class
温故而知新,可以为湿矣
首先请大家记住这个 V8 的在线手册——http://izs.me/v8-docs/main.html。
还记得上次的 building.gyp 文件吗?
// 的 `NumberValue` 函数
Local<Number> num = Number::New(args[0]->NumberValue() + args[1]->NumberValue());
return scope.Close(num);
}
函数大功告成!
最后把尾部的导出函数给写好就 OK 了。
—— 摘自 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 函数的参数意义。
如果你们觉得本系列学习笔记对你们还有帮助的话,就来和我一起搞基吧么么哒~Σ>―(〃°ω°〃)♡→