用C/C++来实现 Node.js 的模块(二)


温故而知新,可以为湿矣

  首先请大家记住这个 V8 的在线手册——http://izs.me/v8-docs/main.html。

  还记得上次的 building.gyp 文件吗?

http://izs.me/v8-docs/classv8_1_1Value.html#a6eac2b07dced58f1761bbfd53bf0e366)
    // 的 `NumberValue` 函数
    Local<Number> num = Number::New(args[0]->NumberValue() + args[1]->NumberValue());

    return scope.Close(num);
}

   函数大功告成!

  最后把尾部的导出函数给写好就 OK 了。

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 函数的参数意义。

  如果你们觉得本系列学习笔记对你们还有帮助的话,就来和我一起搞基吧么么哒~Σ>―(〃°ω°〃)♡→


« 
» 

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3