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

Function.apply()在提升程序性能方面的技巧

2013-11-29 19:25 561 查看
我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值。

比如
alert(Math.max(5,8)) //8
alert(Math.max(5,7,9,3,1,6)) //9

但是在很多情况下,我们需要找出数组中最大的元素。

var arr=[5,7,9,1]
alert(Math.max(arr))    // 这样却是不行的。一定要这样写

function getMax(arr){
var arrLen=arr.length;
for(var i=0,ret=arr[0];i<arrLen;i++){
ret=Math.max(ret,arr[i]);
}
return ret;
}


这样写麻烦而且低效。如果用 apply呢,看代码:

function getMax2(arr){
return Math.max.apply(null,arr);
}


两段代码达到了同样的目的,但是getMax2却优雅,高效,简洁得多。

再比如数组的push方法。
var arr1=[1,3,4];
var arr2=[3,4,5];
如果我们要把 arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]
arr1.push(arr2)显然是不行的。 因为这样做会得到[1,3,4,[3,4,5]]

我们只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)

var arrLen=arr2.length
for(var i=0;i<arrLen;i++){
arr1.push(arr2[i]);
}


自从有了Apply,事情就变得如此简单

Array.prototype.push.apply(arr1,arr2)


*--------------------------------------------------我的分割线--------------------------------------------------*

我的理解说明:

1.先说Math.max()

Math.max(1,2,3,4,5)

Math.max.apply(null,[1,2,3,4,5]);

apply方法能把第二个参数(一个数组),把数组中的n个值,作为n个参数,一起传给应用apply的函数方法.

而这里的null,是因为Math.max函数是一个全局函数.此处不需要改变this指向.

2.再说arr1.push(arr2)

push是所有Array的原型方法,当对arr1应用时,this就指向了arr1.所以使用apply时,将第一个参数设置为arr1,第二个参数arr2将会变为n个参数,一并传给push();

我也可以不用Array.prototype.push,而直接使用: arr1.push.apply(arr1,arr2).也可以达到同样的效果.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: