call apply的作用都是改变this指向
call:call()
方法和apply()
方法作用相同, 区别在于接收参数的方式不同, call()
需要列举所有传入的所有参数。
function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
function Student(name,age,sex,tel,grade){
// var this={name:"",age:"",sex:""}
//Student借用Person函数实现自己的功能(借助别人的方法实现自己的功能)
// Person.call(this,name,age,sex);//指定this指向,第一个参数是改变this指向,需要列举所有传入的所有实参
Person.apply(this,['name','age','sex']);//指定this指向,。第一个参数是改变this指向,将实参封装到一个数组中统一传递
this.tel=tel;
this.grade=grade;
}
var student=new Student("sunny",123,"female",18729407720,2021);
//call把实参按照形参个数传进去
console.log(student);
call例子:
function sum(sum1, sum2) {
return sum1 + sum2;
}
function sumCall1(sum1, sum2) {
return sum.call(this, sum1, sum2); //列举传入的参数
}
console.log(sumCall1(10,20)); // 30
apply:apply()方法需要将实参封装到一个数组中统一传递(即使只有实参只有一个,也要放到数组中)。严格来说只接收argument对象和数组两种形式。
apply例子:
function sum(sum1, sum2) {
return sum1 + sum2;
}
function sumApply1(sum1, sum2) {
return sum.apply(this, arguments) // 传入arguments对象,this是改变指向
}
function sumApply2(sum1, sum2) {
return sum.apply(this, [sum1, sum2]) // 传入数组
}
console.log(sumApply1(10,20)) // 30
console.log(sumApply2(10,20)) // 30
区别:
call(this, arg, arg1, arg2,…);
apply(this, [arg, arg1, arg2,…]);
call,apply的效果完全一样,它们的区别也在于:
- 参数数量/顺序确定就用call,参数数量/顺序不确定的话就用apply。
- 考虑可读性:参数数量不多就用call,参数数量比较多的话,把参数整合成数组,使用apply。
- 参数集合已经是一个数组的情况,用apply,比如上文的获取数组最大值/最小值。