Javascript currying的三种实现

winter版:

 

< script >
function  currying(func)
{
    
return function()
    
{
        
if(arguments.length<func.length)
        
{
            
var args=arguments;
            
var retarg=new Array(func.length-arguments.length);
            
for(var i=0;i<retarg.length;i++)retarg[i]="_"+i;
            eval(
"var ret=function("+retarg+"){return args.callee.apply(this,Array.prototype.slice.call(args).concat(Array.prototype.slice.call(arguments)));}");
            
return currying(ret);
        }

    
else return func.apply(this,arguments);
    }

}

// ///
function  f(a,b,c)
{
    alert([a,b,c]);
}

var  cuf = currying(f);
cuf(
1 )( 2 )( 3 );
cuf(
1 , 2 )( 3 );
</ script >

 muxrwc 版

 

< script type = " text/ecmascript " >
function  currying(func)  {
    
return function () {
        
var root = this, args = arguments, sourceFunc = args.callee;
        
if (args.length < func.length) {
            
return function () {
                
return sourceFunc.apply(
                    root
                    , Array.prototype.slice.call(args).concat(
                        Array.prototype.slice.call(arguments)
                    )
                );
            }
;
        }
 else return func.apply(this, args);
    }
;
}

// ///
var  f  =   function  (a, b, c)  {
    alert([a, b, c]);
}

var  cuf  =  currying(f);
cuf(
1 )( 2 )( 3 );
cuf(
1 2 )( 3 );
cuf(
1 2 3 );
</ script >

 

月版^^

 

< script >
function  currying(func)
{

    
return function()
    
{
        
var args = Array.prototype.slice.call(arguments,0);   

        
if(args.length<func.length)
        
{                     
             
return function(){
                         
var _args = args.concat(Array.prototype.slice.call(arguments,0));   

                         
return currying(func).apply(this,_args);
                }

        }

        
else return func.apply(this,args);
    }

}

// ///
function  f(a,b,c)
{
    alert([a,b,c]);
}

var  cuf = currying(f);
cuf(
1 )( 2 )( 3 );
cuf(
1 , 2 )( 3 );
</ script >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值