js中apply方法与call方法的总结,通俗简洁大白话
想到一种更通俗的解释
- x.x的方法.apply(y,z)意为:y调用了“x的方法”,传入参数为z,z为数组形式
- x.x的方法.call(y,z)意为:y调用了“x的方法”,传入参数为z,z为参数列表形式
---------------------------------以下为详细解释----------------------------------
1.apply(A,B)的总结
作用:
使用别人的函数,且将其参数传入形式改为类数组形式
参数说明:
- 参数A是this指向,可传入一个对象,这个对象将会成为函数执行时的this
- 参数B只能是数组或arguments对象
举例1:不修改this指向
若 a=[5,7,6];
则 Math.min.apply(null,a)=Main.min(5,7,6)=5
意为:让参数A可以使用Math对象的min函数,且将参数B数组变成元素集合传入
说明:参数A是为了改变函数执行时this指向,这里没有改变,所以传入null,this还是指向Math,此处null可换成Math或this
举例2:修改this指向
若 arr1=[1,2];arr2=[3,4]
则 Array.prototype.push.apply(arr1,arr2)=arr1.push(3,4)
备注:push不可推入数组,只可推入参数
举例3:不修改this指向的另一种做法
Math.min.apply(null,a)=Math.min(...a)
...是扩展运算符
用于什么时候:
apply即可使用别人的函数,也可改变参数的传入方式。
若单用前者可用call方法实现;
若单用后者可用扩展运算符实现。
2.call(A,list)的总结
作用:
使用别人的函数
举例1:call与apply的区别
a.fun1.call(b,2,3) 正确
a.fun1.call(b,[2,3]) 会报错
a.fun1.aplly(b,[2,3]) 正确
a.fun1.apply(b,2,3) 会报错
举例2:call/apply可只传入一个参数
animal对象有showName方法,cat对象没有
animal.showName.call(cat); //此句让cat对象调用了animal对象的showName方法
animal.showName.apply(cat)同上
用于什么时候:
call不可改变参数的传入方式,所以常用来使用别人的函数