首页 > 其他分享 >JS函数柯里化

JS函数柯里化

时间:2023-01-11 17:12:53浏览次数:30  
标签:function 函数 JS var cost arguments 柯里化 currying 求值

函数柯里化(function currying)。currying 的概念最早由俄国数学家 Moses
Schönfinkel 发明,而后由著名的数理逻辑学家 Haskell Curry 将其丰富和发展,currying 由此得名。
currying 又称部分求值。一个 currying 的函数首先会接受一些参数,接受了这些参数之后,
该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保
存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。

// 非currying 函数的完整实现,但有助于我们了解其思想
var cost = (function(){
  var args = [];
  return function(){
    if ( arguments.length === 0 ){
      var money = 0;
      for ( var i = 0, l = args.length; i < l; i++ ){
        money += args[ i ];
      }
      return money;
    } else{
      [].push.apply( args, arguments );
    }
  }
})();
cost( 100 ); // 未真正求值
cost( 200 ); // 未真正求值
cost( 300 ); // 未真正求值
console.log( cost() ); // 求值并输出:600
// 通用的 function currying(){}
var currying = function( fn ){
  var args = [];
  return function(){
    if ( arguments.length === 0 ){
      return fn.apply( this, args );
    }else {
      [].push.apply( args, arguments );
      return arguments.callee;
    }
  }
};

var cost = (function(){
  var money = 0;
  return function(){
    for ( var i = 0, l = arguments.length; i < l; i++ ){
      money += arguments[ i ];
    }
    return money;
  }
})();

var cost = currying( cost ); // 转化成 currying 函数

cost( 100 ); // 未真正求值
cost( 200 ); // 未真正求值
cost( 300 ); // 未真正求值
alert ( cost() ); // 求值并输出:600

标签:function,函数,JS,var,cost,arguments,柯里化,currying,求值
From: https://www.cnblogs.com/huangtq/p/17044341.html

相关文章

  • 页面及函数默认添加注释
    使用插件:koroFileHeader这是相关配置https://blog.csdn.net/EmilyHoward/article/details/127849490?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.non......
  • 字符串函数与内存函数(day22)
    strstr函数实例intmain(){chararr1[20]="abcdef";chararr2[20]="de";char*ret=strstr(arr1,arr2);if(ret==NULL)printf("没有找到\n");else......
  • ajax通过jsonp解决跨域问题
    直接上代码:前端:<scriptsrc="./jquery-1.11.2.min.js"></script><script>$(function(){$('#btn').click(function(){varurl="http:......
  • 剑指 Offer 30. 包含min函数的栈
    剑指Offer30.包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop的时间复杂度都是O(1)。 示......
  • C++构造函数【cherno课程学习】
    C++构造函数无参构造函数首先创造一个Entity类,在类里面有两个变量x,y以及一个方法#include<iostream>classEntity{public:floatX,Y;voidPrint(){......
  • js下载文件实现重命名
    需求:通过url下载,并实现重新命名通过download.js效果并不理想,通过创建a标签的方式,无法实现批量下载。这种方式完美解决。最终实现:leturl="文件地址"letname="文件......
  • 蹦床函数实现深度递归的深拷贝;递归改循环,避免栈溢出
    1、先写蹦床函数——可以将递归转为循环执行点击查看代码//蹦床函数functiontoc(func){letargsArr=[];letactive=false;returnfunction(){ar......
  • cmake常用函数记录
    由于cmake我一般是项目移植的时候,才会涉及到,一些常用函数隔一段时间就会忘记,所以在此做一下笔记,以便日后查看。1、添加链接库所在的目录: link_directories("./libs")......
  • Python json中一直搞不清的load、loads、dump、dumps、eval
    做接口测试的时候,有时候需要对字符串、json串进行一些转换,可是总是得花费一些时间,本质来说还是有可能是这几个方法的使用没有弄清楚。(目录)1、json.loads()源码:defloa......
  • Java8常见函数式接口总结
    函数式接口函数式接口:有且仅有一个抽象方法的接口。使用@FunctionalInterface注解来标记。如果接口不是函数式接口就会编译出错满足条件的接口即使不加上注解,那也是函......