在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中是很常见的,其实我们都已经在使用高阶函数了。
Every time you pass an anonymous function or a callback, you’re actually taking the value that the passed function returns, and using that as an argument for another function.
The ability of functions to return other functions extends the convenience of JavaScript, allowing us to create custom named functions to perform specialized tasks with shared template code. Each of these little functions can inherit any improvements made in the original code down the road, which helps us avoid code duplication, and keeps our source clean and readable.
本文根据@David Green的《Higher-Order Functions in JavaScript》所译,整个译文带有我自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://www.sitepoint.com/higher-order-functions-javascript/
淡忘~浅思猜你喜欢 | ||||
【译】JavaScript面试问题:事件委托和this |
【译】有趣的JavaScript原生数组函数 |
JavaScript面向对象精要(一) |
Jade快速入门 |
【译】创建优雅表格的8个js工具 |
无觅 |
转载请注明:淡忘~浅思 » JavaScript的高阶函数