具体的用法我们在后面再说,在这里只需要明白这个是个什么东西就好。(为毛要卖关子?因为 Node.js 官方文档中的例子就是分开来讲的,我现在只是讲第一个 Hello World 的例子而已( ´థ౪థ)σ
添砖加瓦
接下去我们就开始添砖加瓦了。就最简单的两句话:
Handle<Value> Hello(const Arguments& args)
{
HandleScope scope;
return scope.Close(String::New(“world”));
}
这两句话是什么意思呢?大致的意思就是返回一个 Node.js 中的字符串 “world”。
HandleScope
同参考自这里。
Handle 的生命周期和 C++ 智能指针不同,并不是在 C++ 语义的 scope 内生存(即{} 包围的部分),而需要通过 HandleScope 手动指定。HandleScope 只能分配在栈上,HandleScope 对象声明后,其后建立的 Handle 都由 HandleScope 来管理生命周期,HandleScope 对象析构后,其管理的 Handle 将由 GC 判断是否回收。
所以呢,我们得在需要管理他的生命周期的时候申明这个 Scope 。好的,那么为什么我们的代码不这么写呢?
Handle<Value> Hello(const Arguments& args)
{
HandleScope scope;
return String::New(“world”);
}
因为当函数返回时,scope 会被析构,其管理的Handle也都将被回收,所以这个 String 就会变得没有意义。
所以呢 V8 就想出了个神奇的点子——HandleScope::Close(Handle<T> Value) 函数!这个函数的用处就是关闭这个 Scope 并且把里面的参数转交给上一个 Scope 管理,也就是进入这个函数前的 Scope。
于是就有了我们之前的代码 scope.Close(String::New(“world”));。
String::New
这个 String 类所对应的就是 Node.js 中原生的字符串类。继承自 Value 类。与此类似,还有:
•Array
•Integer
•Boolean
•Object
•Date
•Number
•Function
•…
这些东西有些是继承自 Value,有些是二次继承。我们这里就不多做研究,自己可以看看 V8 的代码(至少是头文件)研究研究或者看看这个手册。
而这个 New 呢?这里可以看的。就是新建一个 String 对象。
至此,这个主要函数我们就解析完毕了。
导出对象
我们来温习一下,如果是在 Node.js 里面写的话,我们怎么导出函数或者对象什么的呢?
exports.hello = function() {}
那么,在 C++ 中我们该如何做到这一步呢?
初始化函数
首先,我们写个初始化函数:









