v8的源代码中ArrayMap函数的callbackfn参数是什么?

时间:2019-10-30 09:14:52

标签: c++ v8

在builtins-array-gen.cc中

TF_BUILTIN(ArrayMap, ArrayBuiltinCodeStubAssembler) {
  Node* argc =
      ChangeInt32ToIntPtr(Parameter(BuiltinDescriptor::kArgumentsCount));
  CodeStubArguments args(this, argc);
  Node* context = Parameter(BuiltinDescriptor::kContext);
  Node* new_target = Parameter(BuiltinDescriptor::kNewTarget);
  Node* receiver = args.GetReceiver();

  Node* callbackfn = args.GetOptionalArgumentValue(0, UndefinedConstant());
  Node* this_arg = args.GetOptionalArgumentValue(1, UndefinedConstant());
  InitIteratingArrayBuiltinBody(context, receiver, callbackfn, this_arg,
                                new_target, argc);
  GenerateIteratingArrayBuiltinBody(
      "Array.prototype.map", &ArrayBuiltinCodeStubAssembler::MapResultGenerator,
      &ArrayBuiltinCodeStubAssembler::MapProcessor,
      &ArrayBuiltinCodeStubAssembler::NullPostLoopAction,
      Builtins::CallableFor(isolate(), Builtins::kArrayMapLoopContinuation));
}

我对callbackfn的含义一无所知。

这是this_arg这个指针吗?

但是在我看来,第一个参数应该是this指针,所以我很困惑。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

看看Array.prototype.map的{​​{3}}:其签名是:

arr.map(function callback(currentValue[, index[, array]]) {...} [, thisArg])

这正是您发现的内置内容所反映的内容,只是以V8的内部符号表示。

receiver是呼叫的接收者,即您在.map上调用arr的数组,在MDN示例中。

callbackfn是回调函数,callback是MDN调用的函数。

this_arg是MDN调用的可选thisArg

该代码将callbackfn视为可选的事实并不能反映(也不需要反映)规范;这是安全处理用户未传递回调函数的情况的最便捷方法。重要的是产生的行为,即当无法TypeError不可调用或丢失时抛出callbackfn(这是“不可调用”的特例,因为缺少的参数是未定义的,未定义的是不是功能)。