js apply实现
apply 方法的基本概念
apply 是 JavaScript 中函数对象的一个方法,用于调用函数并指定函数内部的 this 值以及参数列表。apply 的语法如下:
function.apply(thisArg, [argsArray])
thisArg:在函数运行时指定的this值。如果函数处于非严格模式下,null或undefined会被替换为全局对象(浏览器中是window)。argsArray:一个数组或类数组对象,包含传递给函数的参数。如果为null或undefined,则表示不需要传递参数。
使用 apply 调用函数
apply 可以显式地指定函数的 this 值和参数列表。以下是一个简单的示例:

function greet(greeting, punctuation) {
console.log(greeting + ', ' + this.name + punctuation);
}
const person = { name: 'Alice' };
greet.apply(person, ['Hello', '!']); // 输出: Hello, Alice!
apply 与 call 的区别
apply 和 call 的功能类似,区别在于参数传递方式:
apply接受一个数组或类数组对象作为参数列表。call接受参数列表作为单独的参数。
// 使用 call
greet.call(person, 'Hi', '.'); // 输出: Hi, Alice.
// 使用 apply
greet.apply(person, ['Hi', '.']); // 输出: Hi, Alice.
apply 的常见用途
借用其他对象的方法
apply 可以借用其他对象的方法。例如,借用数组的 push 方法:

const arrayLike = { length: 0 };
Array.prototype.push.apply(arrayLike, [1, 2, 3]);
console.log(arrayLike); // 输出: { 0: 1, 1: 2, 2: 3, length: 3 }
合并数组
apply 可以用于合并数组:
const arr1 = [1, 2];
const arr2 = [3, 4];
arr1.push.apply(arr1, arr2);
console.log(arr1); // 输出: [1, 2, 3, 4]
调用父类构造函数
在继承中,apply 可以用于调用父类构造函数:
function Parent(name) {
this.name = name;
}
function Child(name, age) {
Parent.apply(this, [name]);
this.age = age;
}
const child = new Child('Bob', 10);
console.log(child); // 输出: { name: 'Bob', age: 10 }
注意事项
- 在严格模式下,
thisArg为null或undefined时不会替换为全局对象。 - 如果参数列表非常大(如数万个元素),可能会导致堆栈溢出。现代 JavaScript 引擎通常优化了这种情况,但仍需注意。
- 使用
apply传递参数时,确保参数列表是数组或类数组对象。






