Что такое аргумент callbackfn функции ArrayMap в исходном коде v8? - PullRequest
0 голосов
/ 30 октября 2019

В 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 голосов
/ 30 октября 2019

Посмотрите на документацию для Array.prototype.map: ее подпись:

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

И это именно то, что отражено во встроенной вами функции, только что выраженной во внутренней нотации V8.

receiver - получатель вызова, т.е. массив, который вы вызываете .map on, arr в примере MDN.

callbackfn - функция обратного вызова,callback, как MDN вызывает его.

this_arg является необязательным thisArg, как MDN вызывает его.

Тот факт, что callbackfn считается необязательным в этом коде, не отражает(и не нужно отражать) спецификацию;это просто самый удобный способ безопасно обработать случай, когда пользователь не передал функцию обратного вызова. Важное значение имеет результирующее поведение, которое заключается в том, что TypeError генерируется, когда callbackfn не вызывается или отсутствует (что является особым случаем «не вызывается», поскольку отсутствующие параметры не определены, а undefined не является функцией).

...