了解节点插件 API (N-API) HandleScope

2024-05-25

我很难理解如何正确使用手柄范围 https://github.com/nodejs/node-addon-api/blob/master/doc/handle_scope.md and EscapeHandleScope https://github.com/nodejs/node-addon-api/blob/master/doc/escapable_handle_scope.md。例如,从这个节点的例子 https://github.com/nodejs/abi-stable-node-addon-examples/blob/master/8_passing_wrapped/node-addon-api/myobject.cc:

MyObject::MyObject(const Napi::CallbackInfo& info) : Napi::ObjectWrap<MyObject>(info) {
  Napi::Env env = info.Env();
  Napi::HandleScope scope(env);

  this->val_ = info[0].As<Napi::Number>().DoubleValue();
};

为什么在这种情况下我们需要创建一个新的 HandleScope?并从这另一个例子 https://github.com/nodejs/abi-stable-node-addon-examples/blob/master/4_object_factory/node-addon-api/addon.cc:

Napi::Object CreateObject(const Napi::CallbackInfo& info) {
  Napi::Env env = info.Env();
  Napi::Object obj = Napi::Object::New(env);
  obj.Set(Napi::String::New(env, "msg"), info[0].ToString());

  return obj;
}

为什么这里不需要呢?

另外,我没有找到任何使用 EscapeableHandleScope 的示例,什么时候需要这个?


以下内容似乎适用于 nan、N-API 和 node-addon-api:

[Handle Scope] 是一个抽象,用于控制和修改在特定范围内创建的对象的生命周期。一般来说,N-API 值是在句柄范围的上下文中创建的。当从 JavaScript 调用本机方法时,将存在默认句柄范围。如果用户没有显式创建新的句柄范围,则将在默认句柄范围中创建 N-API 值。对于本机方法执行之外的任何代码调用(例如,在 libuv 回调调用期间),该模块是required在调用任何可能导致创建 JavaScript 值的函数之前创建一个作用域。

Source: https://nodejs.org/api/n-api.html#n_api_napi_handle_scope https://nodejs.org/api/n-api.html#n_api_napi_handle_scope

这意味着在给出的例子中,因为两者都期望const Napi::CallbackInfo& info很明显,两者都是直接从 JavaScript 调用的,因此它们已经具有 JS 运行时提供的作用域——只有当您想自己执行内存管理,或者您的代码独立执行时,才需要创建作用域的额外调用JS 引擎(例如计时器、来自 JS 代码以外的回调等)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解节点插件 API (N-API) HandleScope 的相关文章

随机推荐