关于node-addon-api 回调函数里传入的Env参数的问题

node-addon-api 从本地C/C++代码调用javascript函数,使用了

Value Function::Call函数

此函数有6个重载:

inline Value Function::Call(const std::initializer_list<napi_value>& args) const;
inline Value Function::Call(const std::vector<napi_value>& args) const ;
inline Value Function::Call(size_t argc, const napi_value* args) const;
inline Value Function::Call(napi_value recv, const std::initializer_list<napi_value>& args) const;
inline Value Function::Call(napi_value recv, const std::vector<napi_value>& args) const;
inline Value Function::Call(napi_value recv, size_t argc, const napi_value* args) const;

其中最大的区别,就是是否可以提供一个 napi_value 类型的 recv 参数。我查看了 官方的回调例子,发现这个参数是这样传的:

cb.Call(env.Global(), {Napi::String::New(env, "hello world")});

我又查看了其他没有这个参数的重载,发现内部,其实封装了一个Env().Undefined()

比如:

inline Value Function::Call(size_t argc, const napi_value* args) const {
  return Call(Env().Undefined(), argc, args);
}

我完全没搞明白这个参数有什么意义,Env的Global和Undefined(还有一个Null),又有什么区别。

我的解答思路和尝试过的方法

这个node-addon-api 是对 node-api 的一个c++的封装,我浏览了Call函数,其实最终调用了napi_call_function
而我查阅了开发文档的 http://nodejs.cn/api/addons.html#callbacks发现用的是 Null(isolate),也就是有可能对应的node-addon-api 里的 Env 的 Null(猜的)。

按我网上搜到的文章来看,有人说这个其实就是传给了function的this,如果传env.Global的话,那么js代码里的this === global为 true
但我在js调试里打断点,我发现传global、undefined或者是null,前面那个测试都成立。所以有没有哪位能解答一下这个参数起什么作用?