在Javascript中,有高阶函数的概念,因而很适合函数式编程。那神马是高阶函数呢?没有神马具体的定义,但高阶函数有两个显著的特征:。用函数做参数或返回一个函数。
函数作为参数
众所周知,函数是Javascript中的一等公民,不仅能被赋值,也能和普通变量一样,作为函数的参数。
如果你有Javascript的Web编程经验或者是一个前端开发者,就会经常碰到回调函数。在某个操作完成之后会被执行的函数就被称为回调函数。通常,回调函数都是匿名的,并作为最后一个函数传递给调用者。
由于Javascript是单线程的,也就意味着,同一时刻只有一个操作在进行,其它操作则在队列中等候当前操作的完成。在支持高阶函数特性的语言中,采取的策略是传递一个将在父函数操作完成之后被执行的函数,可以允许异步行为,因此,在等待响应时,脚本可以继续执行。
这在Web的编程中是非常有用的,因为脚本可能在某处会向服务器发送一个Ajax请求,并且需要处理服务器的响应,而由于网络延迟或者服务器处理时间是不可控的,我们并不知道响应会什么时候到达。Node.js会频繁使用回调来充分利用服务器资源。
举个粟子,看看下面的Javascript代码片段,给按钮添加一个点击监听:
<button id="clicker">So Clickable</button>
document.getElementById("clicker").addEventListener("click", function() {
alert("you triggered " + this.id);
});
脚本中使用匿名函数来触发弹框。当然,也可以单独定义一个函数,并把函数名作为参数传递给addEventListener:
var proveIt = function() {
alert("you triggered " + this.id);
};
document.getElementById("clicker").addEventListener("click", proveIt);
注意,传递的是proveIt而不是proveIt()。当你通过不带括号的名字传递一个函数时,传递的是函数对象本身;而传递的名字待括号时,则传递的是函数执行后的结果。
函数作为结果返回
除了可以将函数作为参数之外,Javascript还允许一个函数将另一个函数作为结果返回。这很有意思,因为函数是一个对象,它可以返回任何其他值。
但是将函数作为结果返回有神马含义呢?将一个函数定义为另一个函数的返回值,可以允许你创建一个函数,这个函数作为新函数的模板。这就打开了Javascript函数编程的另一道大门。
举个粟子,假设你对于所有文章中的专有名词 Millennials 感到厌烦,想要用 Snake People 替换所有的 Millennials。一时冲动,你可能只写了一个简单地文本替换函数:
var snakify = function(text) {
return text.replace(/millenials/ig, "Snake People");
};
console.log(snakify("The Millenials are always up to something."));
// The Snake People are always up to something.
对于这种特定情况,这是可行的。但某一天,你有对 Baby Boomers 感到厌恶了,也想调用一个简单地函数用其它文本替换掉可恶的 Baby Boomers 。虽然函数实现很简单,但是你又不想重复已经写过的代码:
var hippify = function(text) {
return text.replace(/baby boomers/ig, "Aging Hippies");
};
console.log(hippify("The Baby Boomers just look the other way."));
// The Aging Hippies just look the other way.
由于函数可以作为结果被返回,因而Javascript可以提供一种更方便的方式:
var attitude = function(original, replacement, source) {
return function(source) {
return source.replace(original, replacement);
};
};
var snakify = attitude(/millenials/ig, "Snake People");
var hippify = attitude(/baby boomers/ig, "Aging Hippies");
console.log(snakify("The Millenials are always up to something."));
// The Snake People are always up to something.
console.log(hippify("The Baby Boomers just look the other way."));
// The Aging Hippies just look the other way.
高阶函数在Javascript中是很常见的,其实我们都已经在使用高阶函数了。