zoukankan      html  css  js  c++  java
  • 函数柯里化

    函数柯里化

    在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。而对于JavaScript语言来说,我们通常说的柯里化函数的概念,与数学和计算机中的柯里化的概念并不完全一样。

    对于已经柯里化后的函数来说,当接收的参数数量原函数的形参数量相同时,执行原函数;当接收的参数数量小于原函数的形参数量时,返回一个函数用于接收剩余的参数,直至接收的参数数量与形参数量一致,执行原函数。

    柯里化的定义:接收一部分参数,返回一个函数接收剩余参数,接受足够参数后,执行原函数。

    普通版

    function curry(fn,len = fn.length,...args) {
        return function(...params){
            let _args = [...args,...params]
            if(_args.length >= len){
                return fn.apply(this,_args);
            }else{
                return curry.call(this,fn,len,..._args)
            }
        }
    }
    

    占位符版

    function _curry(fn,length,holder,args = [],holders = []){
        return function(..._args){
            //将参数复制一份,避免多次操作同一函数导致参数混乱
            let params = args.slice();
            //将占位符位置列表复制一份,新增加的占位符增加至此
            let _holders = holders.slice();
            //循环入参,追加参数 或 替换占位符
            _args.forEach((arg,i)=>{
                //真实参数 之前存在占位符 将占位符替换为真实参数
                if (arg !== holder && holders.length) {
                    let index = holders.shift();
                    _holders.splice(_holders.indexOf(index),1);
                    params[index] = arg;
                }
                //真实参数 之前不存在占位符 将参数追加到参数列表中
                else if(arg !== holder && !holders.length){
                    params.push(arg);
                }
                //传入的是占位符,之前不存在占位符 记录占位符的位置
                else if(arg === holder && !holders.length){
                    params.push(arg);
                    _holders.push(params.length - 1);
                }
                //传入的是占位符,之前存在占位符 删除原占位符位置
                else if(arg === holder && holders.length){
                    holders.shift();
                }
            });
            // params 中前 length 条记录中不包含占位符,执行函数
            if(params.length >= length && params.slice(0,length).every(i=>i!==holder)){
                return fn.apply(this,params);
            }else{
                return _curry.call(this,fn,length,holder,params,_holders)
            }
        }
    }
    

      

  • 相关阅读:
    让服务器可以下载apk和ipa文件
    MVC第一次访问比较慢的解决方案
    [C#]记录程序耗时的方法【转发】
    uploadify上传带参数及接收参数的方法
    uploadify上传之前判断一个input输入框是否为空
    jgGrid获得的id值是主键的id而不是jqGrid的行号值
    jqGrid删除多行数据问题
    Linux下的微秒级定时器: usleep, nanosleep, select, pselect
    Linux平台延时之sleep、usleep、nanosleep、select比较
    Linux 高精確的時序(sleep, usleep,nanosleep) from:http://blog.sina.com.cn/s/blog_533ab41c0100htae.html
  • 原文地址:https://www.cnblogs.com/zhenjianyu/p/13027610.html
Copyright © 2011-2022 走看看