现在的位置: 首页 > 综合 > 正文

我写的一个链式调用函数

2012年08月16日 ⁄ 综合 ⁄ 共 5862字 ⁄ 字号 评论关闭
<!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 arg = [1,2];使function(arg)等同于function(1,2),所以用了很笨拙,很冗余的代码写法。这个是柯里化后的版本,这个函数也暂时支持最多2参数。
var wsc = function(func_positon){
    if(func_positon == 0){
            return function(){
            var original_arry_len = this.length ,original_arry = this, Arg = arguments,Arg_length = arguments.length,return_array = [],real_func = Arg[func_positon];

            for(var i=0; i<original_arry_len; i++){
                return_array[i] = real_func(original_arry[i]);
            }

            return return_array;
        }
    }

    if(func_positon == 1){
        return function(){
            var original_arry_len = this.length ,original_arry = this, Arg = arguments,Arg_length = arguments.length,return_array = [],real_func = Arg[0];

            if(Arg_length == 2){
                for(var i=0; i<original_arry_len; i++){
                    return_array[i] = real_func(original_arry[i],Arg[1]);
                }
            }
            return return_array;
        }
    }
    if(func_positon == 2){
        return function(){
            var original_arry_len = this.length ,original_arry = this, Arg = arguments,Arg_length = arguments.length,return_array = [],real_func = Arg[1];

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

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

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

// Array.prototype.wsc = wsc(0);
//
 var numTemp = [1, 2, 3].wsc(double).wsc(double).wsc(double);  

// Array.prototype.wsc1 = wsc(1);
//
 var numTemp = [1,2,3].wsc1(inc,1);

Array.prototype.wsc2 = wsc(2);
var numTemp = [1,2,3].wsc2(2,inc);

console.log(numTemp);
</script>
</head>
<body></body>

</html> 

接下来的版本是第一个版本的不同写法,就是代码好看了一定点,但是效率不如第一版本高

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf8" />
<title>链式调用3</title>
<script type="text/javascript">
//该函数的作用就是,函数参数和使用函数位置调换。还需要完善的是,去掉第一个参数,也就是函数位置指定。因为不知道,var arg = [1,2];使function(arg)等同于function(1,2),所以用了很笨拙,很冗余的代码写法。这个函数也暂时支持最多3参数。还有一种就是用函数柯里化,就是[1,2,3].wsc1(inc,5);或者[1,2,3].wsc2(5.inc);
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){
        for(var i=0; i<original_arry_len; i++){
            if(func_positon == 1){
                return_array[i] = real_func(original_arry[i],Arg[2]);
            }
            else if(func_positon == 2){
                return_array[i] = real_func(Arg[1],original_arry[i]);
            }
        }
    }
    else if(Arg_length == 4){
        for(var i=0; i<original_arry_len; i++){
            if(func_positon == 1){
                return_array[i] = real_func(original_arry[i],Arg[2],Arg[3]);
            }
            else if(func_positon == 2){
                return_array[i] = real_func(Arg[1],original_arry[i],Arg[3]);
            }
            else if(func_positon == 3){
                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(2,5,ind,3);
console.log(numTemp);
</script>
</head>
<body></body>

</html> 

 

 

抱歉!评论已关闭.