JavaScript 中 Function.prototype.apply 和 Function.prototype.call 的区别

1. Function.prototype.apply 和 Function.prototype.call 的概述

在 JavaScript 中,Function.prototype 是所有函数的原型。在该原型上,定义了许多实用的方法,其中就包括 apply() 和 call() 方法。这两个方法在更改函数内部 this 指向方面非常有用,其使用方法也是非常相似的。不过,它们也略有不同。在本文中,我们将探究它们之间的区别。

2. Function.prototype.apply

2.1 apply 的基本使用

apply() 方法允许您在对象上调用函数,将对象作为函数的参数传递,并更改函数内部 this 的指向。语法如下:

function.apply(thisArg, [argsArray])

其中,thisArg 是 this 需要指向的对象。如果传递 null 或 undefined,则为全局对象。argsArray 是一个数组,表示函数的参数。

2.2 apply 的示例

下面的代码演示了 apply() 如何将对象用作函数的参数,并更改函数内部 this 的指向:

const person = {

fullName: function() {

return this.firstName + " " + this.lastName;

}

}

const person1 = {

firstName: "John",

lastName: "Doe"

}

const person2 = {

firstName: "Mary",

lastName: "Doe"

}

// 调用 person 的 fullName 函数,使用 person1 对象作为函数的 this,并将参数传递给函数

console.log(person.fullName.apply(person1)); // John Doe

// 调用 person 的 fullName 函数,使用 person2 对象作为函数的 this,并将参数传递给函数

console.log(person.fullName.apply(person2)); // Mary Doe

上述代码中,person 是一个简单的 JavaScript 对象,其中包含一个返回完整名称的函数。person1 和 person2 是包含名称的两个对象。apply() 方法在这里用于调用 person.fullName(),并使用 person1 和 person2 对象作为 this 对象,并将参数传递给函数。

3. Function.prototype.call

3.1 call 的基本使用

与 apply() 方法类似,call() 方法允许您在对象上调用函数,并更改函数内部 this 的指向。语法如下:

function.call(thisArg, arg1, arg2, ...)

其中,thisArg 是 this 需要指向的对象。如果传递 null 或 undefined,则为全局对象。arg1, arg2, ... 表示函数的参数列表。

3.2 call 的示例

下面的代码演示了 call() 如何将对象用作函数的参数,并更改函数内部 this 的指向:

const person = {

fullName: function() {

return this.firstName + " " + this.lastName;

}

}

const person1 = {

firstName: "John",

lastName: "Doe"

}

const person2 = {

firstName: "Mary",

lastName: "Doe"

}

// 调用 person 的 fullName 函数,使用 person1 对象作为函数的 this,并将参数传递给函数

console.log(person.fullName.call(person1)); // John Doe

// 调用 person 的 fullName 函数,使用 person2 对象作为函数的 this,并将参数传递给函数

console.log(person.fullName.call(person2)); // Mary Doe

上述代码与前一个示例的区别在于使用 call() 方法来调用 person.fullName() 函数。与 apply() 方法相比,call() 方法允许您单独传递函数的每个参数作为参数列表,而不是将它们封装在一个数组中。

4. 区别和共同点

apply() 和 call() 方法的共同点在于二者都允许您更改函数内部的 this 指向。例如,可以使用这两种方法将一个对象作为参数传递给函数,这个对象将被用作函数内部的 this。

二者的区别在于参数列表的传递方式不同。在 apply() 方法中,参数必须被封装在一个数组中。而在 call() 方法中,则可以在参数列表中单独传递每个参数。

5. 总结

在 JavaScript 中,apply() 和 call() 方法都是非常有用的函数。它们允许您更改函数内部的 this 指向,并将一个对象用作函数的参数。尽管两种方法之间的区别很小,但在某些情况下,可能更喜欢其中一种方法,而不是另一种。