javascript Curring 基本概念

在看javascript中的Curring之前,先了解下什么是Curring,引用wiki上的解释: 在计算机科学中,柯里化(Currying),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 柯里化的作用就如上所述,可以简化参数,在某些时候可以让程序看起来更简单。这样也与数学中函数的 特性保持一致了(函数完全变成「接受一个参数;返回一个值」的固定形式)。对于那些函数式语言(如lisp,Haskell) 来说,可以容易的实现Curring,因为函数是“一等公民”,在函数编程中,似乎所有工作都围绕者函数进行, 函数一般作用就是接收参数(包括函数参数),处理逻辑,返回处理结果(包括返回一个函数)。javascript作为一门支持函数式编程的 语言来说,当然也是可以实现Curring的。如下的例子:

###处理两个参数函数的Curring

假设有一个连接两个字符串的函数: function concatStr(str1,str2){ return str1 + str2; } 现在根据柯里化方法,把它变成接收一个参数,并返回一个函数。所以我们再定义一个Curring函数: var curring = function(fn,str2){ return function(str1){ return fn(str1,str2); } }

最后调用: var concata = curring(concatStr,‘a’);//将concatStr函数简化参数,将返回的匿名函数赋值给concata变量 console.log(concata(‘b’));//调用Curring化后的函数,传递的参数作为原函数的第一个参数

###推广到处理多个参数函数的Curring

function concatStr(){
            var fullStr;
            var Args = Array.prototype.slice.call(arguments);
            for(var i = 0;i < Args.length;i++){
                fullStr += Args[i];
            }
            return Args;
        }

var curring = function(fn){
            var aArgs = Array.prototype.slice.call(arguments,1);
            return function(){
                var bArgs = Array.prototype.slice.call(arguments),
                     abArgs = aArgs.concat(bArgs);
                     return fn.apply(null,abArgs);
            }
}

//调用
var concata = curring(concatStr,'a','c','d');
alert(concata('b'));

###更有意义的例子

var space = {
            id : '1',
            getId : function(){
                setTimeout(function(){
                    console.log(this.id);
                },1000);
            }

        };
        space.getId();

上述程序本想得到id,但是在senTimeout函数中,this的作用域已经发生变化,不在指向space,为了可以正确获得id,可以修改如下: var space = { id : ‘1’, getId : function(){ var self = this; setTimeout(function(){ console.log(self.id); },1000); }

};

上述代码通过构造将this变量赋值给self,利用闭包的性质,使得setTimeout中匿名函数执行的时候继续能引用到this。 这是一种方法,我们也可以通过上面的curring函数,将外面的id传递给匿名函数:

var space = {
    id : '1',
    getId : function(){
    setTimeout(curring(function(id){
    console.log(id);
    },this.id),1000);
    }   
};

似乎看上去比前面的方法更晕了,哈哈哈,这也是函数式编程的精妙所在呀,其实本质上还是利用了闭包的性质。

本篇小结

介绍了柯里化(Curring)的基本概念,并通过几个简单的例子通过javascript来实现,都是些基础知识,往后再往深处研究。

##文档信息