js函数柯里化的延伸

更新日期: 2018-12-27阅读: 2.2k标签: 柯里化

需求: 

如果我们需要设计一个函数,来计算每个月的开销,在每天结束之前,我们需要记录当天花费了多少。在月底的时候计算出这个月一共开销了多少? 

下面的实现分为了4种方式,每种方式我们都会统计执行所消耗的时间。


方式一:

var total = 0;
function cost(money){
    total += money;
};
console.time(1)
cost(100);
cost(200);
cost(300);
console.log(total);//输出:600
console.timeEnd(1) //1: 4.392822265625ms

该实现方式,在每天结束都会累计当天的花费,但我们并不需要关心每天花掉多少,只需要记录一下就可以,在月底才进行统计一个月的开销是多少。


方式二:  

首先想到的是函数柯里化的使用。

var cost = (function(){
    var args = [];
    return function(){
        if(arguments.length === 0){
            var money = 0;
            for(var i in args){
                money += args[i];
            }
            return money;
        }else{
            [].push.apply(args, arguments);
        }
    }
}());
console.time(2)
cost(100);
cost(200);
cost(300);
console.log(cost());//求值并输出:600
console.timeEnd(2) //2: 0.22021484375ms

函数柯里化又称部分求值。是指一个函数首先会接受一些参数,但该函数并不会立即求值,而是返回另外一个函数,之前传入的参数 在函数形成的闭包里被保存起来。待到函数真正需要求值的时候,之前传入的参数都会被一次性用于求值。


方式三:    

柯里化看上去很高级,似乎也有点用处,然而很多需求不一定使用它是最好的实现,下面以以更通俗易懂的方式实现。

var total=[];
function set(data){
	total.push(data)
}
function get(){
	var money = 0;
	for(var i in total){
        money += total[i];
    }
	return money;
}
console.time(3)
set(100);
set(200);
set(300);
console.log(get());//求值并输出:600
console.timeEnd(3) //3: 0.19091796875ms

可以看出在性能上和方式二差不多,但是这样做更加通俗易懂了,当然在实际开发中,我们一般会封装为对象。


方式四:

将方式三的形式,通过封装对象来实现:

var obj={
	total:[],
	set:function(data){
		this.total.push(data)
	},
	get:function(){
		var money = 0;
		for(var i in this.total){
			money += this.total[i]
		}
		return money
	}
}
console.time(4)
obj.set(100);
obj.set(200);
obj.set(300);
console.log(obj.get());//求值并输出:600
console.timeEnd(4) //4: 0.185791015625ms


总结:

js是一门很灵活的语言,实现一些简单的需要,并不一定需要多么高级的实现模式,柯里化个人觉得实际项目中使用的并不多,js基础掌握好了,在同样性能的情况下,代码越简洁越好吧。下面看下上面四种方式的执行时间,当然不同浏览器有一定差异



链接: https://fly63.com/article/detial/1712

JavaScript函数柯里化

理论计算机科学中,柯里化提供了在简单的理论模型中,比如:只接受一个单一参数的lambda演算中,研究带有多个参数的函数的方式。 函数柯里化的对偶是Uncurrying,一种使用匿名单参数函数来实现多参数函数的方法。

javascript偏函数应用与柯里化的区别

很多刚刚了解函数式编程的人会对偏函数应用(partial application)和柯里化(currying)之间的区别感到困惑。实际上,直到现在也很少在 JavaScript 中看到柯里化的实际使用,许多叫curry()的工具函数并不是柯里化函数。它们其实是偏函数!

柯里化与反柯里化

柯里化,是一个逐步接收参数的过程。在接下来的剖析中,你会深刻体会到这一点。 反柯里化,是一个泛型化的过程。它使得被反柯里化的函数,可以接收更多参数。目的是创建一个更普适性的函数,可以被不同的对象使用。

js高级函数技巧-函数柯里化

我们经常说在Javascript语言中,函数是“一等公民”,它们本质上是十分简单和过程化的。可以利用函数,进行一些简单的数据处理,return 结果,或者有一些额外的功能,需要通过使用闭包来实现,最后经常会return 匿名函数。

Js柯里化

柯里化(Currying),又称部分求值(Partial Evaluation),是把接收多个参数的函数变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受剩余的参数而且返回结果的新函数的技术。

javascript实现函数柯里化与反柯里化

把接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,并返回接受剩余的参数而且返回结果的新函数的技术。其由数学家Haskell Brooks Curry提出,并以curry命名。

Js之函数柯里化

最近在社区阅读技术博客的时候偶然间看到了函数柯里化几个字,还有要求手写js函数柯里化,心想是柯里化是什么高级的东西?没听说过啊?就带着问题出发,专门去学习了一下,做了一些整理。

理解Javascript的柯里化

函数式编程是一种如今比较流行的编程范式,它主张将函数作为参数进行传递,然后返回一个没有副作用的函数,说白了,就是希望一个函数只做一件事情。这种编程思想涵盖了三个重要的概念:

函数柯里化详解

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的

JavaScript函数柯里化的一些思考

很多同学都能看出来,这些写是非常傻的,因为函数f1和f是等效的,我们直接令var f1 = f;就行了,完全没有必要包裹那么一层。但是,下面一段代码就未必能够看得出问题来了:

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!