zoukankan      html  css  js  c++  java
  • 我写的一个链式调用函数

    <!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>

    合乎自然而生生不息。。。
  • 相关阅读:
    WSAAsyncSelect模型触发不了FD_Close消息?
    WSAAsyncSelect模型中,FD_WRITE事件什么时候触发?
    VC学习笔记:状态栏
    VC++对话框中加状态栏
    c++子类和父类成员函数重名
    vim学习笔记(11):vim 去掉<200b>
    tensorflow笔记5:tensorflow的基本运作,函数
    Anaconda的使用和包的更新;conda 创建虚拟环境
    vim学习笔记(10):vim命令大全
    tensorflow笔记4:函数:tf.assign()、tf.assign_add()、tf.identity()、tf.control_dependencies()
  • 原文地址:https://www.cnblogs.com/samwu/p/2659423.html
Copyright © 2011-2022 走看看