JavaScript 解释call()和apply()方法
call()方法: call方法主要用于使用不同的 this 对象调用函数。在JavaScript中 this 指的是一个对象。它取决于我们如何调用特定的函数。在全局作用域中, this 指向全局对象 window 。在函数内部, this 同样指向全局对象 window 。
在严格模式下,当我们使用任何函数时, this 指的是 undefined 。在像call这样的函数中,this可能指向不同的对象。借助call方法,我们可以使用不同的对象调用特定的函数。
语法:
object.objectMethod.call( objectInstance, arguments )
参数:
它接受两个参数:
- ObjectInstance: 它是一个我们想要明确使用的对象
- Arguments: 它是我们想要传递给调用函数的参数
示例1:
Javascript
<script>
const obj = {
firstName: "First_name",
lastName: "Last_name",
printName: function () {
console.log(this.firstName
+ " " + this.lastName);
}
};
obj.printName();
</script>
输出:
First_name Last_name
显然,因为我们正在使用对象obj调用printName()函数,所以 this 应该指的是对象obj。在对象obj内部,我们有firstName = “First_name”和lastName = “Last_name”,所以输出结果是“First_name Last_name”。
示例2: 正如我们所知,我们可以使用不同的对象调用特定的函数。所以我们也可以使用不同的对象调用printName函数。
Javascript
<script>
const obj1 = {
firstName: "First_name",
lastName: "Last_name"
};
const obj2 = {
firstName: "Sachin",
lastName: "Tendulkar"
};
function printName() {
console.log(this.firstName + " " + this.lastName);
}
printName.call(obj2);
</script>
输出:
Sachin Tendulkar
在这种情况下,我们使用call方法来调用带有对象obj2的函数。所以在这种情况下, this 将指向对象 obj2 。因为this取决于我们如何实际调用函数。在这种情况下, this 不会指向全局对象 window ,而是指向对象 obj2 。
使用call方法传递参数: 我们也可以通过call函数传递参数。
示例3:
Javascript
<script>
const obj1 = {
firstName: "First_name",
lastName: "Last_name"
};
const obj2 = {
firstName: "Sachin",
lastName: "Tendulkar"
};
function printName(profession, country) {
console.log(this.firstName + " "
+ this.lastName + " " +
profession + " " + country);
}
printName.call(obj2, "Cricketer", "India");
</script>
输出:
Sachin Tendulkar Cricketer India
使用call方法传递参数时,参数之间用逗号(,)分隔。
apply()方法: 就像call方法一样,我们也可以将函数绑定到任何对象上。使用apply()方法,我们还可以使用不同的对象调用给定的函数。
语法:
object.objectMethod.apply(objectInstance, arrayOfArguments)
参数: 它需要两个参数:
- ObjectInstance :我们想要显式使用的对象
- Arguments :我们要传递给调用函数的参数
Javascript
<script>
const obj1 = {
firstName: "First_name",
lastName: "Last_name"
};
const obj2 = {
firstName: "Sachin",
lastName: "Tendulkar"
};
function printName() {
console.log(this.firstName + " " + this.lastName);
}
printName.apply(obj2);
</script>
输出:
Sachin Tendulkar
使用apply方法传递参数: 我们也可以使用apply函数传递参数。
Javascript
<script>
const obj1 = {
firstName: "First_name",
lastName: "Last_name"
};
const obj2 = {
firstName: "Sachin",
lastName: "Tendulkar"
};
function printName(profession, country) {
console.log(this.firstName + " "
+ this.lastName + " " +
profession + " " + country);
}
printName.apply(obj2, ["Cricketer", "India"]);
</script>
输出:
Sachin Tendulkar Cricketer India
极客教程