如何在JavaScript中使用高阶函数

52 阅读3分钟

JavaScript的一个特点是,它可以接受高阶函数,这使它非常适合函数式编程。高阶函数是一个可以接受另一个函数作为参数的函数,或者可以返回一个函数作为结果。

第一类函数

你可能听说过这样的说法:JavaScript将函数视为一等公民。这意味着JavaScript中的函数被当作对象来对待。它们的类型是Object ,它们可以作为一个变量的值被分配,而且它们可以像其他引用变量一样被传递和返回。

当涉及到函数式编程时,这种本地能力给了JavaScript特殊的力量。因为函数是对象,该语言支持一种非常自然的函数式编程方法。事实上,它是如此自然,以至于我敢打赌,你一直在使用它,甚至没有想过。

将函数作为参数

如果你做过很多基于网络的JavaScript编程或前端开发,你可能已经遇到过使用回调的函数。回调是一个在一个操作结束时被执行的函数,一旦所有其他的操作都完成了。通常这个回调函数是作为函数的最后一个参数传入的。通常,它被定义为内联的匿名函数。

由于JavaScript是单线程的,也就是说,一次只发生一个操作,每一个要发生的操作都会沿着这个单线程排队。在父函数的其他操作完成后再传入一个函数来执行,这种策略是支持高阶函数的语言的基本特征之一。它允许异步行为,所以一个脚本可以在等待结果的同时继续执行。在处理那些可能在不确定的时间段后返回结果的资源时,传递回调函数的能力至关重要。

这在网络编程环境中非常有用,一个脚本可能会向服务器发送一个Ajax请求,然后需要在响应到来时进行处理,事先不知道网络延迟或服务器的处理时间。Node.js经常使用回调来最有效地利用服务器资源。这种方法对于在执行功能之前等待用户输入的应用程序来说也很有用。

例如,考虑这个简单的JavaScript片段,它为一个按钮添加了一个事件监听器。

[code language="js"]
So Clickable

document.getElementById("clicker").addEventListener("click", function() {
alert("you triggered " + this.id);
});
[/code]

这个脚本使用一个匿名的内联函数来显示一个警报。但它也可以很容易地使用一个单独定义的函数,并将这个命名的函数传递给addEventListener 方法

[code language="js"]
var proveIt = function() {
alert("you triggered " + this.id);
};

document.getElementById("clicker").addEventListener("click", proveIt);
[/code]

请注意,我们把proveIt ,而不是proveIt() 传递给我们的addEventListener 函数。当你传递一个函数的名字而不加括号时,你传递的是函数对象本身。当你用圆括号传递它时,你传递的是执行该函数的结果。

继续阅读《如何在JavaScript中使用高阶函数》,请点击SitePoint