我现在每天都在做javascript。我来自OO背景,我接触过的大部分代码都是程序性/ OO风格。我正在寻找能够以功能性方式解决或多或少典型的Web编程任务的好例子。
我没有兴趣拥有任何看起来像功能的任意例子。我正在寻找一个例子,可以展示如何使用功能强大来解决问题比使用其他方法更好。我知道这是一种主观/风格依赖,但不要让自己(我自己)太难。
答案 0 :(得分:17)
首先,您想要理解函数式编程的含义;也就是说,什么是核心概念以及语言如何使您遵守这些概念。对于OOP,核心概念是封装,继承和多态(或者只是为小公司传递消息)。对于FP,中心原则是referential transparency(这意味着无国籍)。尝试使用不支持功能特性的语言(例如,作为第一类对象的函数)的功能样式进行编程即使不是不可能也会很尴尬。与没有OOP功能的语言中的OOP编程相同。
幸运的是,Javascript是多范式并支持两者。不要寻找“功能”的代码示例,而只考虑可以确保引用透明度的所有方法,这将自然导致使用语言的FP功能,如lambdas,closures ,高阶函数(例如map,reduce,filter),currying等。
说真的,这不是一个非答案。我真的认为这是接近它的最有动力和最有效的方式。
那就是说,这里有一些希望有用的链接。
答案 1 :(得分:5)
Douglas Crockford从他的Functional JavaScript资源页面链接到JavaScript。以下是该网站的摘录:
功能是一个功能库 用JavaScript编程。它定义了 标准的高阶函数 例如map,reduce(aka foldl)和 选择(也称为过滤器)。它也定义了 功能,如咖喱,rcurry和 部分功能部分 应用;并撰写,保护和 直到功能级编程。 所有这些功能都接受了 字符串,例如'x - > x + 1','x + 1'或 '+1'作为更详细的同义词 function(x){return x + 1}。
答案 2 :(得分:1)
我记得的一个例子是一个绑定到对象的函数,用于注册为事件处理程序
function bind(aHandler, aBind) {
var handler = aHandler;
var bind = aBind;
return function(event) {
return handler.call(bind, event);
}
}
它处理范围(currying)并且很方便。
答案 3 :(得分:0)
看看jQuery。这个博客是一个很好的案例,它是一个功能性的风格。 http://importantshock.wordpress.com/2009/01/18/jquery-is-a-monad/
也就是说,JS并不是一种真正的函数式语言(IMO),因此试图强制它成为一种可能不是开发人员最有效的途径(使用螺丝刀作为锤子)墙但不是那么快:)。再说一遍,它是一种lambda语言。