我写的一个链式调用函数

<! DOCTYPE html >
< html >
< head >
     < meta  charset ="utf8"   />
< title >链式调用 </ title >
< script  type ="text/javascript" >
// 该函数的作用就是,函数参数和使用函数位置调换。还需要完善的是,去掉第一个参数,也就是函数位置指定。因为不知道,var arg = [1,2];使function(arg)等同于function(1,2),所以用了很笨拙,很冗余的代码写法。这个函数也暂时支持最多3参数。
Array.prototype.wsc =  function(func){  
     var original_arry_len =  this.length ,original_arry =  this, Arg = arguments,Arg_length = arguments.length;return_array = [],func_positon= Arg[0] || 0,real_func = Arg[func_positon];

     if(Arg_length == 1){
         for( var i=0; i<original_arry_len; i++){
            return_array[i] = func(original_arry[i]);
        }
    }
     else  if(Arg_length == 3){
         if(func_positon == 1){
             for( var i=0; i<original_arry_len; i++){
                return_array[i] = real_func(original_arry[i],Arg[2]);
            }
        }
         else  if(func_positon == 2){
             for( var i=0; i<original_arry_len; i++){
                return_array[i] = real_func(Arg[1],original_arry[i]);
            }
        }
    }
     else  if(Arg_length == 4){
         if(func_positon == 1){
             for( var i=0; i<original_arry_len; i++){
                return_array[i] = real_func(original_arry[i],Arg[2],Arg[3]);
            }
        }
         else  if(func_positon == 2){
            for( var i=0; i<original_arry_len; i++){
                return_array[i] = real_func(Arg[1],original_arry[i],Arg[3]);
            }
        }
         else  if(func_positon == 3){
             for( var i=0; i<original_arry_len; i++){
                return_array[i] = real_func(Arg[1],Arg[2],original_arry[i]);
            }
        }
    }
    
     
     return return_array;  
}

  
function  double(x){  
     return x * 2;  
}


function inc(x,y){ 
     return x + y;
}

function ind(x,y,z){
     return x + y + z;
}
   

   
var numTemp = [1, 2, 3].wsc( double).wsc( double).wsc( double);
//  var numTemp = [1, 2, 3].wsc(2,3,inc);//函数第一个参数是指调用函数的位置,这里的2表示,调用函数位置在第二位,于是调用函数跟调用函数的第二个参数,调换了位置。
//
 var numTemp = [1, 2, 3].wsc(1,ind,2,3);
console.log(numTemp);
</ script >
</ head >
< body ></ body >
</ html >

接下来是一个柯里化的版本

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf8" />
<title>后序语法之函数参数和函数的位置调换</title>
<script type="text/javascript">
//函数参数和函数的位置调换
var wsc = function(func_position){  

    return function(){
        var original_arry_len = this.length ,original_arry = this, Arg = arguments,Arg_length = arguments.length,return_array = [],real_func = Arg[func_position-1];
        
       
        for(var j=0; j<original_arry_len;j++){//数组遍历
            var Arg_array = [];
            for(var i=0; i<Arg_length; i++){//遍历参数列表,然后找出实际函数所在位置,用数组元素代替
                if(func_position-1 == i){
                    Arg_array.push(original_arry[j])
                }
                else{
                    Arg_array.push(Arg[i]);
                }
            
            }
            return_array[j] = real_func.apply(null,Arg_array);
        }
        
        return return_array;
    };

}

  
function double(x){  
    return x * 2;  
}


function inc(x,y){ 
    return x + y;
}

function ind(x,y,z){
    return x + y + z;
}
   

   
Array.prototype.wsc1 = wsc(1);//指定实际函数在参数1位置。为什么要指定位置呢,本来是通过检测参数里面的类型是否函数,是则得出位置;后来发现,有些函数专门处理函数,所以这方法行不通。所以要指定位置。
var numTemp1 = [1,2,3].wsc1(double);

Array.prototype.wsc2 = wsc(2);//指定实际函数在参数2位置
var numTemp2 = [1,2,3].wsc2(2,inc);

Array.prototype.wsc3 = wsc(2);
var numTemp3 = [1,2,3].wsc2(2,ind,3).wsc1(double);

console.log(numTemp1);
console.log(numTemp2);
console.log(numTemp3);

var numTemp4 = [1,2,3];
numTemp4.wsc1 = wsc(1);
console.log(numTemp4.wsc1(double));
</script>
</head>
<body>
    
</body>
</html>

 

转载于:https://www.cnblogs.com/samwu/archive/2012/08/28/2659423.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值