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 指向,并将一个对象用作函数的参数。尽管两种方法之间的区别很小,但在某些情况下,可能更喜欢其中一种方法,而不是另一种。