您的位置:首页 > 移动开发

js中apply()的用法,及apply()和call()的区别

2018-01-04 14:36 316 查看

一、先说说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,个人的理解,有错误之处请予以指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息