v8 源代码中 ArrayMap 函数的回调 fn 参数是什么?



内置阵列-gn.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指针,所以我很困惑。

谢谢你的帮助。

查看Array.prototype.map的文档:其签名为:

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

这正是您发现的内置代码中反映的内容,只是用V8的内部表示法表示。

receiver是调用的接收方,即您在其上调用.map的数组,在MDN示例中为arr

callbackfn是回调函数,callback作为MDN调用它

this_arg是MDN所称的可选thisArg

该代码认为callbackfn是可选的,这一事实并不反映(也不需要反映(规范;这是安全处理用户没有传递回调函数的情况的最方便的方法。重要的是产生的行为,即当callbackfn不可调用或丢失时抛出TypeError(这是"不可调用"的特殊情况,因为丢失的参数是未定义的,而未定义的不是函数(。

最新更新