js柯里化

160 阅读2分钟

js柯里化

  • 柯里化是什么
    • 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
    • 柯里化是指将使用多个参数的函数转换成一系列使用一个参数的函数的技术。
    • 函数柯里化(function currying)又称部分求值。一个currying的函数首先会接受一些参数,接受了这些参数后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包里被保存起来。待到函数真正需要求值的时候,之前传入的参数都会被一次性用于求值。
    • js中的柯里化
      • 实例分析,计算每月开销的函数。在每天结束之前,我们都要记录今天花了多少钱
          var monthlyCost = 0;
        
          var cost = function(money){
          	monthlyCost += money;
          };
        
          cost(100);//第一天开销
          cost(200);//第二天开销
          cost(300);//第三天开销
          //cost(700);//第三十天开销
        
          alert(monthlyCost);//输出:600
        
        但我们不太关心每天花掉多少,只想知道月底总共花掉了多少,也就是说,只需要在月底计算一次;
        • 柯里化不完整实现:
             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
          
        • 柯里化:
          	var currying = function(fn){
          		var args = [];
          			return function inner(){
          				if(arguments.length === 0){
          					return fn.apply(this, args);
          				}else{
          					[].push.apply(args, arguments);
          					return inner;
          				}
          			}
          	};
          	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);//未真正求值
          	console.log(cost());
          
          

  • 作者简介:黄杰,芦苇科技web前端开发工程师 专注于前端领域框架、交互设计、图像绘制、数据分析等研究,访问 www.talkmoney.cn 了解更多