apply的使用技巧

1.什么是apply?他和call有什么区别?

apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.
 
Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这是一个数组或者类数组对象,它将作为参数传给Function
 
call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。
 
Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:这个对象将代替Function类里this对象
params:这个是一个参数列表

2.什么情况下用apply,什么情况下用call?
在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用的时候参数的列表是对应一致的就可以采用 apply , 如果参数列表不是数组就可以用call来实现了,call可以直接指定参数列表对应值的位置。

3.apply的巧妙应用

一般在目标函数需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地将数组转化为参数列表形式

(a)比如:取一个数组的最大值

// Math.max()的参数不支持数组,这时可以使用apply就可实现支持数组参数了。
Math.max(param1,param2,param3…)

// 使用apply劫持,利用apply的参数将数组转换为参数列表,从而实现在数组中找到最大值
Math.max.apply(null, Array)

同理也可以找到数组中的最小值:

Math.min.apply(null, Array)

(b)用 apply 将数组添加到另一个数组

// push接受可变数量的参数,我们也可以一次推送多个元素。但是不能直接推送一个数组,
concat确实具有我们想要的行为,但它实际上并不附加到现有数组,而是创建并返回一个新数组。
var arr1 = ['a', 'b']; var arr2= [0, 1, 2]; arr1.push.apply(arr1, arr2); console.info(arr1); // ["a", "b", 0, 1, 2]

4.参考

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

原文地址:https://www.cnblogs.com/codebook/p/10471849.html