# apply
Function.apply(obj, args)
- obj:这个对象将代替 Function 类里 this 对象
- args:这个是类数组,它将作为参数传给 Function (args->arguments)
call 和 apply 的意思一样,只不过是参数列表不一样.
Function.call(obj, param1, param2...)
- obj:这个对象将代替 Function 类里 this 对象
- params:这个是一个参数列表
如下在 Student 中 Person.apply(this, arguments)
调用 Person, 但是 Person 中的 this 是 new 出来的 Student 对象
,所以 student 对象上就有了 name, age 属性
1 | function Person(name, age) { |
缓存函数运行结果
1 | let memoize = function (f) { |
# apply 的巧妙应用
# 将一个数组传递给一个不接受数组作为参数的函数
ES6 中 可以使用 ...
代替,例如 let max = Math.max.apply(null,array) <=> let max = Math.max(...array)
a) Math.max 可以实现得到数组中最大的一项
因为 Math.max 参数里面不支持 Math.max ([param1,param2]) 也就是数组,但是它支持 Math.max (param1,param2,param3…),所以可以根据刚才 apply 的那个特点来解决 let max = Math.max.apply(null,array)
, 这样轻易的可以得到一个数组中最大的一项 (apply 会将一个数组装换为一个参数接一个参数的传递给方法),这块在调用的时候第一个参数给了一个 null, 这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,所以直接传递了一个 null 过去
注意: Math.max 方法的参数中只要有一个值被转为 NaN, 则该方法直接返回 NaN
1 | > Math.max(1,null) //相当于 Math.max(1,0) |
b) Array.prototype.push 可以实现两个数组合并
同样 push 方法没有提供 push 一个数组,但是它提供了 push (param1,param,…paramN) 所以同样也可以通过 apply 来装换一下这个数组,即:
1 | let arr1 = new Array("1", "2", "3"); |
- 转换类数组对象为数组
1 | let a = Array("1", "2"); |
# 填补稀疏数组
apply 配合 Array (这里不需要加 new) 使用,可以将数组中的缝隙填补为 undefined 元素,因为 apply 不会忽略数组中的缝隙,会把缝隙作为 undefined 参数传递给函数
1 | console.log(Array.apply(null, ["a", , "b"])); // [ 'a', undefined, 'b' ] |
https://www.cnblogs.com/chenhuichao/p/8493095.html > https://www.cnblogs.com/ziyunfei/archive/2012/09/18/2690412.html > https://segmentfault.com/q/1010000006793990