浅谈JavaScript中的柯里化函数

  首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu):html

     在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,而且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。数组

用于建立已经设置好了一个或多个参数的函数 与函数绑定类似,他们之间的区别在于:当函数被调用时,返回的函数还须要设置一些传入的参数闭包

  
下面咱们来看看具体的代码:
function curry(fn){
            var args = Array.prototype.slice.call(arguments, 1);
            return function(){
                var innerArgs = Array.prototype.slice.call(arguments),
                    finalArgs = args.concat(innerArgs);
                return fn.apply(null, finalArgs);
            };
        }

相应的调用:app

function add(num1, num2){
            return num1 + num2;
        }
        
        var curriedAdd = curry(add, 5);
        alert(curriedAdd(3));   //8

 

   那么,下面咱们来一步一步的解释上面的curry函数:   首先,不要被其形式参数所迷惑,难不成就只能传一个参数了吗?  固然不是,js是支持可变参数的,咱们并不要求其参数形式,最终调用者传过来的全部参数咱们均可以经过arguments来访问,OK,咱们先来解释第一行:函数

var args = Array.prototype.slice.call(arguments, 1);

  要读懂这一句的前提是咱们要熟悉call函数的调用,以及Array对象的slice方法的熟悉,此处再也不累赘,读者能够自行去查,调用slice(1)将会返回除了第一个元素之外的后面的全部的元素的数组形式。 同时他具有将调用者直接将arguments转换为数组形式的能力,咱们此处是用函数的arguments去调用的slice();   官方给arguments的定义是:spa

An argument is a value (primitive or object) passed as input to a function.prototype

 

arguments 对象并非一个真正的Array。它相似于数组,但没有数组所特有的属性和方法,除了 length。例如,它没有 pop 方法。不过能够经过slice将其转换成数组:code

此处的结果是: args = [5]     此时args保存了来自外部函数的数组htm

 

 

那么:接下来,咱们将一个匿名函数返回给了调用者,此处造成了一个闭包, 对闭包不是很熟悉的童鞋能够看看我以前写过的一篇文章: http://www.cnblogs.com/Frank-C/p/4964999.html对象

将这个匿名函数返回之后呢:下一步咱们就开始调用了curriedAdd(3):咱们如今讲目光转向这个匿名函数:

return function(){
                var innerArgs = Array.prototype.slice.call(arguments),
                    finalArgs = args.concat(innerArgs);
                return fn.apply(null, finalArgs);
            };

再次调用slice,注意,读者应该将此时的arguments和以前再匿名函数在外curry函数以内的arguments区分,他们的调用者和调用方式都不同了哦。   此处,咱们把调用方传过来的参数转化为数组,—》》》innerArgs = [3]  而后:咱们链接两个数组  

---》》》finalArgs = [5,3];

 

最后咱们直接调用以前传入的函数fn(经过curry函数传入)来时实现最终的add方法,此处没有用call函数,而是用的apply函数,是由于关系到他们两个之间的差异,apply的参数是能够用数组包裹的!!!

 

   经过上面的几步的简单讲解。咱们能够总结:函数的柯里化其实就是在调用一个拥有多个参数的函数以前,提早传入他们的部分参数,后期调用时就只要传余下的部分了!   

相关文章
相关标签/搜索