跳到主要内容

apply

2024年03月12日
柏拉文
越努力,越幸运

一、认识


Function.prototype.apply() 会以给定的 this 值和作为数组(或类数组对象)提供的 arguments 调用该函数。

二、语法


apply(thisArg)
apply(thisArg, argsArray)
  • thisArg: 调用 func 时提供的 this 值。如果函数不处于严格模式,则 nullundefined 会被替换为全局对象,原始值会被转换为对象。

  • argsArray: 一个类数组对象,用于指定调用 func 时的参数,或者如果不需要向函数提供参数,则为 nullundefined

三、返回值


使用指定的 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]);