一、改变 this 指向
var person = {
fullName: function() {
return this.firstName + ' ' + this.lastName
}
}
var people = {
firstName: "Wang",
lastName: "Mingming"
}
var theName = person.fullName.apply(people);
console.log( theName ); // Wang Mingming
this 原本是谁调用指向谁,在 person 对象中,本来是指向 person 的,但是 person 中并没有firstName 和 lastName 变量。 apply 将 this 指向了 people ,所以能够获取到 people 内的变量值给 person 使用。
call() 同理。
接下来是是我个人理解,可能有误!!!!
上方代码理解起来等同于这样,但实际应该不是这样
var person = {
firstName: "Wang",
lastName: "Mingming",
fullName: function() {
return this.firstName + ' ' + this.lastName
}
}
var theName = person.fullName();
console.log( theName ); // Wang Mingming
二、将数组入参变为一般入参
此作用是 apply() 与 call() 最大的区别
apply() 第二个参数接收的是数组,call() 不是
apply() 使用场景:
当一个函数入参是非数组,但你拥有的是一个数组,你不想先处理完数组再进行入参操作,就可以用apply 解决。
Math.max(1,2,3)//3
Math.max([1,2,3])//报错
Math.max.apply(null,[1,2,3])//3
需要注意的是这里的第一个值为null时,
在 “JavaScript 严格模式”下则它将成为被调用函数的所有者(对象)也就是没改变指向在“非严格”模式下,它成为全局对象。
apply() 具体使用
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var people = {
firstName:"Wang",
lastName: "Mingming"
}
person.fullName.apply(people, ["长沙", "中国"]); //Wang Mingming,长沙,中国
call() 具体使用
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var people = {
firstName:"Wang",
lastName: "Mingming"
}
person.fullName.call(people, "长沙", "中国"); //Wang Mingming,长沙,中国
扩展:其实使用 ... 解构也能达到效果
Math.max(...[1,2,3]) //3