JavaScript面试之柯里化函数

92 阅读2分钟

柯里化函数 / 函数的柯里化

配合 模块化开发使用的一种函数的编程语法

    `将 一个函数中输入多个参数的形式修改成 多个函数 每个函数设定 一个参数`

本质上是闭包的语法形式

    原始函数
        function fun( 参数1 , 参数2 , 参数3... ){}


    柯里化后的函数
        function fun( 参数1 ){
            return function( 参数2 ){
                return function( 参数3 ){ 
                    ....
                }
            }
        }

柯里化函数的优点

1,  之前的函数每次调用都要输入多个参数
    柯里化的函数 每次调用 只需要输入一个参数
    语法形式更简洁

2,  之前的函数 被多次调用执行 
    如果 正则表达式 需要修改 
    每一次调用的函数中 参数都需要修改

    柯里化的函数 只需要将第一次调用时 输入的实参正则表达式修改 
    之后每次调用输入的实参字符串不需要修改
    可维护性可操作性更高

柯里化函数的缺点

柯里化函数本质上使用的是闭包的语法形式
具有 闭包语法的优点缺点
        // 正则验证函数
        // 参数1    reg 是你输入的正则表达式 
        // 参数2    str 是你输入的要验证的字符串 
        function isReg( reg , str ){

            return reg.test( str );

        }

        // 验证账号 数字字母下划线6-8位
        let res1 = isReg( /^\w{6,8}$/ , '1234567' );
        let res2 = isReg( /^\w{6,8}$/ , '123' );
        console.log( res1 );
        console.log( res2 );


        // 验证密码 数字字母下划线7-9位
        let res3 = isReg( /^\w{7,9}$/ , '1234567' );
        let res4 = isReg( /^\w{7,9}$/ , '123' );
        console.log( res3 );
        console.log( res4 );

        // 验证邮箱 数字字母下划线3-6位
        let res5 = isReg( /^\w{3,6}$/ , '1234567' );
        let res6 = isReg( /^\w{3,6}$/ , '123' );
        console.log( res5 );
        console.log( res6 );


        // 柯里化之后的正则验证函数

        function isReg( reg ){

            return function( str ){

                return reg.test( str );

            }

        }

        // 变量nameRegFun 中 存储的是 return 的匿名函数
        // 匿名函数中 reg.test( str ) 
        // reg 存储的是 当前输入的 正则表达式
        const nameRegFun =  isReg( /^\w{6,8}$/ );

        // 调用 变量nameRegFun
        let res1 = nameRegFun('1234567');
        let res2 = nameRegFun('123');
  
        console.log( res1 );
        console.log( res2 );