V8引擎Function类的Call函数第一个参数什么意思?

发布于 2022-08-28 12:04:25 字数 1354 浏览 8 评论 0

#define BUILDING_NODE_EXTENSION
#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)

主要是第十二行 cb->Call(Context::GetCurrent()->Global(), argc, argv);

原代码在这里然后文档里面是这么写的

V8EXPORT Local
v8::Function::Call ( Handle< Object > recv, int argc, Handle< Value > argv[] )

第一个参数是 Handle<Object> recv

求问这个参数是干吗用的?什么意思?它调用的时候为什么要用 Context::GetCurrent()->Global()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

北陌 2022-09-04 12:04:25

唔,其实答案还是在源码V8.h里,1720行起。

/**
 * A JavaScript function object (ECMA-262, 15.3).
 */
class Function : public Object {
 public:
  V8EXPORT Local<Object> NewInstance() const;
  V8EXPORT Local<Object> NewInstance(int argc, Handle<Value> argv[]) const;
  V8EXPORT Local<Value> Call(Handle<Object> recv,
                             int argc,
                             Handle<Value> argv[]);
  V8EXPORT void SetName(Handle<String> name);
  V8EXPORT Handle<Value> GetName() const;
};

那么V8::Function::Call的接口和ECMA-262里的定义15.3里的[[Call]]是一致的。

注意,[[Call]](15.3.4.5.1)的定义和Function.prototype.call(15.3.4.4)的定义完全不一样的。
[[Call]]Function.prototype.call(及其他几乎所有ECMA-262中定义的Function.prototype)的实现过程中需要调用的内部方法。

15.3.4.5.1 [[Call]]

When the [[Call]] internal method of a function object, F, which was created using the bind function is called with a this value and a list of arguments ExtraArgs, the following steps are taken:

  1. Let boundArgs be the value of F’s [[BoundArgs]] internal property.
  2. Let boundThis be the value of F’s [[BoundThis]] internal property.
  3. Let target be the value of F’s [[TargetFunction]] internal property.
  4. Let args be a new list containing the same values as the list boundArgs in the same order followed by the same values as the list ExtraArgs in the same order.
  5. Return the result of calling the [[Call]] internal method of target providing boundThis as the this value and providing args as the arguments.

所以第一个参数就是执行上下文,用于确定代码执行时的this

然后LZ给的源码,其实就是把全局作用域当做this传进了Call而已,作用是在全局作用域里面调用自身(上下文中的cb)。

提笔落墨 2022-09-04 12:04:25

参加 javascript, function.call(this,arg...)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文