1. 概念
- 每个函数都包含两个非继承而来的方法:apply()和call()。
- call与apply都属于Function.prototype的一个方法,所以每个function实例都有call、apply属性;
2. 作用
- call()方法和apply()方法的作用相同:改变this指向。
3. 区别
- 他们的区别在于接收参数的方式不同:
- call():第一个参数是this值没有变化,变化的是其余参数都直接传递给函数。在使用call()方法时,传递给函数的参数必须逐个列举出来。
- apply():传递给函数的是参数数组
4. 应用
var name = "Evan";
var age = 20;
var person = {
name: "Hillary",
age: 19,
sayIntroduce: function () {
return (
"Hello, My name is " + this.name +" and I'm " +this.age +" years old."
);
},
sayHobby: function (val1, val2) {
return "I'm " + this.name + ", I like " + val1 + " and " + val2 + ".";
},
};
var person1 = {
name: "Coy",
};
console.log(person.sayIntroduce());
// Hello, My name is Hillary and I'm 19 years old.
// 当我们通过 call 和 apply 来this的指向时,不传任何参数,则默认为将this指向修改为 windows
console.log(person.sayIntroduce.call());
// Hello, My name is Evan and I'm 20 years old.
console.log(person.sayIntroduce.apply());
// Hello, My name is Evan and I'm 20 years old.
// 有参数时,this 指向第一个参数:将this指向 person1,
由于person1中没有age属性,因此为 undefined
console.log(person.sayIntroduce.call(person1));
// Hello, My name is Coy and I'm undefined years old.
console.log(person.sayIntroduce.apply(person1));
// Hello, My name is Coy and I'm undefined years old.
// 当需要传递参数时,call可以直接写多个参数,apply需要用数组方式传递:
console.log(person.sayHobby.call(person1, 'swimming', 'hiking'));
// I'm Coy, I like swimming and hiking.
console.log(person.sayHobby.apply(person1, ['swimming', 'hiking']));
// I'm Coy, I like swimming and hiking.