call和apply的方法和作用有些类似,
call()方法接受的是若干个参数的列表,
apply()方法接受的是一个包含多个参数的数组。
let arr = [num0,num1]
fun.call(this, num0, num1)
fun.apply(this, arr)
这里要注意的是
两个参数都不是必填的,第一个参数在函数中使用时,根据场景不同指向也不一样,当不填时默认指向的是window对象。
在继承方面区别
function father(name, age) {
this.name = name;
this.age= age;
}
function child1(name, age) {
father.call(this, name, age);
this.category = 'child1';
}
function child2(name, age) {
father.apply(this, [name, age]);
this.category = 'child2';
}
var first= new child1('one', 11);
var second= new child2('two', 22);
console.log(first.category ,first.name,first.age) // child1,one,11
console.log(second.category ,second.name,second.age) //child2,two,22
继承方面两者用法几乎一致,唯一的区别就是传参的时候,call是参数队列,apply是数组
apply的实用妙招
1.筛选组中的最大值或最小值
let arr = [7,3,6,9,4,2,10,5]
let max = '' , min = ''
//通常我们想到的是遍历for循环
for (var i = 0; i < arr .length; i++) {
if (arr [i] > max)
max = arr [i];
if (arr [i] < min)
min = arr [i];
}
//或者将数组用sort排序截取收尾
max = arr.sort((a,b)=>a-b).pop()
min = arr.sort((a,b)=>a-b).unshift() //正常还是slice截取就好
//其实我们也可以用apply的方式
var max = Math.max.apply(null, numbers);
var min = Math.min.apply(null, numbers);
2.函数传参
项目中我们经常遇到接口返回的函数是数组,我们函数里需要的是单独的参数队列,这时候我们可能会想着把数组的值取出来再传参
其实就可以直接用apply的继承特性,fun.apply(this,[ddd,fff,fff])
function do(name, age,love) {
if(name=='mi'){
return '1111111'
}else if(age=='12'){
return '222222'
}else if(love == 'love'){
return '3333'
}else{
return 'nonon'
}
}
//接口返回参数是['li','12','like']
//我们还得想办法拆分出来,再传到函数里,用apply就好了
do.apply(null,['li','12','like'])