在异步插件中正确使用HandleScope

sno*_*lhg 9 v8 node.js

我正在编写一个异步Node Addon,但我一直在努力弄清楚我是否需​​要在调用客户端JavaScript回调的"After"函数中使用HandleScope.我已经看到了有和没有新范围的示例,但从来没有任何解释原因.这是一个例子:

void asyncWorkAfter(uv_work_t* req) {
   HandleScope scope; // <-- Do you need a new scope?

   const int argc = 1;
   Local<Value> foo = String::New("foo");
   Local<Value> argv[] = { foo };

   // assume I got my callback function out of req
   callback->Call(Context::GetCurrent()->Global(), argc,  argv);

   callback.Dispose();

   // if i use a new HandleScope, what happens to argv when we go out of scope?
   // Do i need to do something like a scope.Close() to copy argv to the parent scope?
}
Run Code Online (Sandbox Code Playgroud)

在拨打回叫电话时,您是否需要/想要一个HandleScope?
如果您使用新的HandleScope,示例中的argv会发生什么?

exe*_*ook 1

String::New("foo")将在堆上分配一些东西并返回一个句柄,因此您需要以某种方式释放该句柄引用的内存。如果您将它们附加到HandleScopev8,一旦所有引用计数为零,就会为您完成此操作。

本地句柄保存在堆栈中,并在调用适当的析构函数时被删除。这些句柄的生命周期由句柄范围决定,该范围通常在函数调用开始时创建。当句柄作用域被删除时,垃圾收集器可以自由地释放以前由句柄作用域中的句柄引用的那些对象,前提是它们不再可以从 JavaScript 或其他句柄访问。

https://developers.google.com/v8/embed