

这段代码表面上看有些复杂,但拆解后就能发现它是对 JavaScript 的一些核心概念(如 apply 和 call)的运用。我们一步步来分析,最后看看会输出什么。
这段代码里包含三个核心概念:
Function.prototype.call 是啥?
call 是 JavaScript 函数的一个方法,它用来调用某个函数,并指定 this 的值和参数。例如:
function add(x, y) {
return x + y;
}
console.log(add.call(null, 3, 4)); // 输出 7这里 add.call(null, 3, 4) 就是直接调用函数 add,把 this 设置为 null,参数是 3 和 4。
apply 是啥?
apply 跟 call 很像,但是参数需要用数组形式传递。例如:
function add(x, y) {
return x + y;
}
console.log(add.apply(null, [3, 4])); // 输出 7区别是:
call 的参数一个个写:call(this, arg1, arg2)apply 的参数用数组写:apply(this, [arg1, arg2])先看 Function.prototype.call.apply((a) => a, [1, 2]),我们分步拆解:
Function.prototype.call 是一个函数它可以调用别的函数。
apply 的作用把 (a) => a 当成目标函数,把 [1, 2] 作为参数传给 call。
所以这段代码实际上等价于:
Function.prototype.call.call((a) => a, 1, 2);读起来可能有点晕,继续拆解!
call 是作用在 (a) => a 这个箭头函数上的。1 是 this 的值(对箭头函数无意义,因为箭头函数不依赖 this)。2 是传给 (a) => a 的参数。因此,这段代码等效于:
let r = (a) => a; // 定义箭头函数
r = r(2); // 调用箭头函数,传入 2这段代码的效果就是调用了 (a) => a,传入参数 2,结果是 2。
console.log(r); // 输出 2用一句话总结这段代码:
它就是一层套一层,最后把参数 2 交给了箭头函数 (a) => a,结果就是 2。