call()和apply()的区别

call和apply的相同点是:1、都可以调用函数;2、都可以改变this的指向

function add(c, d) {
    return this.a + this.b + c + d;
}
var strObj = { a: 1, b: 2};
console.log(add.apply(strObj,[3,3])); 
console.log(add.call(strObj,3,3)); 
//以上两个打印结果都是 9

不同点:

1、call的多个参数, 第一个参数是this指向的对象,后面的参数均是传入Function的参数,有两个就是传给Function两个参数,有三个就是传了三个,有几个传几个;

2、apply的只有两个参数,第一个参数是this指向的对象,第二个参数是传入Funtion的参数组成的数组。

apply实现取出数组中的最值:

//数组中的最大值:
var arr=[2,4,8,5,67,89,64,32,697]
Math.max.apply(Math,arr) //打印结果是 697


//数组中的最小值:
var arr=[2,4,8,5,67,89,64,32,697]
Math.min.apply(Math,arr) //打印结果是 2


//注意:因为apply第一个值是可以改变this的指向,这个案例不需要改变this指向,那么我们就指向调用者,所以第一个参数就传值Math

apply可以通过Array.prototype.push实现两个数组的合并:

push方法没有提供push一个数组,但是它提供了push(param1,param2...paramN),所以也可以用apply来转换一下这个数组

var arr1=[2,8,5,54,82,55];
var arr2=[6,4,35,34,21,93,432,23]
Array.prototype.push.apply(arr1,arr2);   //打印结果是5
 //得到合并后数组的长度,因为push就是返回一个数组的长度

也可以这样理解,arr1调用了push方法,参数是通过apply将数组转换为参数列表的集合。

当然,也有人可能会说数组合并也可以用数组的concat方法,可以是可以,但是要清除其区别是concat使用之后返回的是一个数组(当然也可以获取其长度),而通过apply将数组转化的结果是一个集合的长度。不同场景可以区别使用。

原文地址:https://www.cnblogs.com/web001/p/14807633.html