apply
2024年03月12日
一、认识
Function.prototype.apply()
会以给定的 this
值和作为数组(或类数组对象)提供的 arguments
调用该函数。
二、语法
apply(thisArg)
apply(thisArg, argsArray)
-
thisArg
: 调用func
时提供的this
值。如果函数不处于严格模式,则null
和undefined
会被替换为全局对象,原始值会被转换为对象。 -
argsArray
: 一个类数组对象,用于指定调用func
时的参数,或者如果不需要向函数提供参数,则为null
或undefined
。
三、返回值
使用指定的 this
值和参数调用函数的结果。
四、应用场景
4.1 Array.push & apply
const array = ["a", "b"];
const elements = [0, 1, 2];
array.push.apply(array, elements);
console.info(array); // ["a", "b", 0, 1, 2]
4.2 Math.min() & apply
// 数组中的最小/最大值
const numbers = [5, 6, 2, 3, 7];
// 用 apply 调用 Math.min/Math.max
let max = Math.max.apply(null, numbers);
// 这等价于 Math.max(numbers[0], …) 或 Math.max(5, 6, …)
let min = Math.min.apply(null, numbers);
五、实现原理
Function.prototype.myApply = function (thisArg, argArray = []) {
const fn = this;
if (thisArg) {
thisArg = Object(thisArg);
} else {
thisArg = typeof window === "undefined" ? global : window;
}
thisArg.fn = fn;
const result = thisArg.fn(...argArray);
return result;
};
function foo(name, age) {
console.log(this);
console.log(name, age);
}
const obj = {
name: "柏拉图",
age: 23,
};
foo.myApply(null, ["哈哈哈", 32]);