sum([1, 2]);
原函数恐怕是不好使的, 可以考虑重写:
- [quote]function sum(arr) {
- return arr[0] + arr[1];
- }[/quote]
但现实中, sum 函数可能不是我们自己写的.
比如是一个库中的方法, 而你又没办法修改.
我们只能做层嫁衣了:
- [quote]function sumWithArray(array) {
- return sum.apply(null, array);
- }[/quote]
上面巧妙的应用了, apply 方法, 因为 apply 的第二参数是需要为数组的.
然而只有一个方法, 需要这么变态的用法时, 那还好办.
可那里还有个 multiply:
- [quote]function multiply(a, b) {
- return a * b;
- }[/quote]
这样一来, 我们考虑事情, 就需要站在更高层次上想问题,
能否有一种通用的方式来做呢?
此时我们再看 sumWithArray 那个函数, 如果要用通用的方式来做的话,
函数体中 sum 最起码不应该是写死的, 应该是传进来的参数.
我们来尝试改写一下, 把此函数变成通用的函数:
- [quote]function withArray(fun, array) {
- return fun.apply(null, array);
- }[/quote]
此时求和或者求积, 可以如下调用:
- [quote]withArray(sum, [1, 2]);
- withArray(multiply, [1, 2]);[/quote]
但是问题又来了, 我不能每次调用求和, 都这么写一次吧:
- [quote]withArray(sum, [1, 2]);
- withArray(sum, [2, 4]);
- withArray(sum, [6, 9]);[/quote]
因为数据是变的, 前面 sum 此时倒不需要变:
看来我们有必要将 withArray 改成一个返回值是函数的函数:
- [quote]function withArray(fun) {
- return function(array) {
- return fun.apply(null, array);
- }
- }[/quote]
此方案相对来说, 就是漂亮的方案了. 我们可以使用如下
- [quote]var mySum = withArray(sum);
- mySum([2, 4]);
- mySum([3, 7]);[/quote]
甚至可以用匿名函数来定义一个减法的:
- [quote]var minus = withArray(function(a, b) {
- return a - b;
- });
- minus([5, 4]);[/quote]
最后我们来看看这个 withArray 函数:
此函数是以函数为参数, 以函数为返回值. 典型函数式编程风格.
上述案例来自于书籍JavaScript 函数式编程.
最近正看这方面的文章, 甚至还下了一本范畴论来准备研究研究, 看来数学还是很有用武之地嘛.
来源: http://www.qdfuns.com/article/17398/0dbfd882a3fa50c2d62891c3d536b2c2.html