一、先说说apply()
在MDN上面是这么解释的:
The apply() method calls a function with a given this value, and arguments provided as an array (or an array-like object).
//该apply()方法调用具有给定this值的函数,并arguments以数组(或类似数组的对象)的形式提供。
个人理解:
对象a下面有一个方法fn,
调用fn:a.fn()
很明显这个fn里面的this指向是a;
那如果想改变this的指向,想让它指向对象b;
那么就是:
a.fn.apply(b)
具体方法:
function.apply(thisObj, [argsArray])
function:要调用的方法
thisObj:方法里面的this指向的对象
[argsArray]:调用方法传入的参数,接收的是一个数组
话不多说,上个栗子
//构造函数
function creatFn (name){
this.name = name;
};
var a = new creatFn('小a');
var b = new creatFn('小b');
//对象a下面的方法say
a.say = function(a,b){
console.log(this.name,a+b);
}
//正常调用
a.say(1,2);//输出: 小a,3
//this指向b对象
a.say.apply(b,[3,4]);//输出 :小b,7
二、那么call()和apply()之间的区别呢
他们在功能上说,还真的说出来区别
在写法上面是有区别的
如上例的最后一步
a.say.apply(b,[3,4])
换成apply就该这么写了
a.say.call(b,3,4)
有木有发现区别?
就是apply总共是两个参数,第二个参数是个数组,是调用方法的参数集合
但是call就有n个参数了,第一个是方法里面的this指向的对象,剩下的参数就全是给调用方法的参数们了。
三、好处在哪呢?
要说好处的话,就想说说apply的一个聪明的用法
下面这个方法:
Math.max(num1,num2,num3,num4,num5)
这个方法就是返回的就是传入的那些参数中最大的数字;
来一道常见的面试题:
如何从下面数组中找出最大值
var arr =[1,2,3,5,7,9.9,100,189]
那么就可以用Math.max()方法了,无奈的是他不接受一个数组啊,这时候apply()就该闪亮登场了
//利用apply可以让方法在调用的时候将所有的参数以数组的形式传入
Math.max.apply(null,arr)
注意:如果不想改变this的话,第一个参数传入null就可以了
该方法同样适用于求最小值
Math.min.apply(null,arr)
同样的还有一个方法
arr.push()
追加到数组
假如
var arr1 = [1,2,3]
var arr2 = [4,5,6]
如果我想把arr1和arr2合并,也可以用push的方法,怎么用呢?
//下面是错误示例
arr1.push.apply(null,arr2)
为什么不能这么写呢,因为push是Arrary的方法呀,
//正确写法
Array.prototype.push.apply(arr1,arr2)
以上是参照MDN,个人的理解,有错误之处请予以指正