JavaScript中什么是回调或者高阶函数

  介绍

这篇文章给大家分享的是有关JavaScript中什么是回调或者高阶函数的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

在JavaScript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用,既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回。

因为函数是第一类对象,我们可以在JavaScript使用回调函数。在下面的文章中,我们将学到关于回调函数的方方面面。回调函数可能是在JavaScript中使用最多的函数式编程技巧,虽然在字面上看起来它们一直一小段JavaScript或者jQuery代码,但是对于许多开发者来说它任然是一个谜。在阅读本文之后你能了解怎样使用回调函数。

回调函数是从一个叫函数式编程的编程范式中衍生出来的概念。简单来说,函数式编程就是使用函数作为变量。函数式编程过去,甚至是现在,依旧没有被广泛使用,它过去常被看做是那些受过特许训练的,大师级别的程序员的秘传技巧。

幸运的是,函数是编程的技巧现在已经被充分阐明因此像我和你这样的普通人也能去轻松使用它。函数式编程中的一个主要技巧就是回调函数。在后面内容中你会发现实现回调函数其实就和普通函数传参一样简单。这个技巧是如此的简单以致于我常常感到很奇怪为什么它经常被包含在讲述JavaScript高级技巧的章节中。

一个回调函数,也被称为高阶函数,是一个被作为参数传递给另一个函数(在这里我们把另一个函数叫做<代码> otherFunction> otherFunction>

下面是一个在jQuery中使用回调函数简单普遍的例子:

//注意到点击方法中是一个函数而不是一个变量//它就是回调函数   $ (“# btn_1") .click(函数(){   警报(“Btn 1 Clicked");   });

正如你在前面的例子中看到的,我们将一个函数作为参数传递给了<代码>点击方法。<代码>点击方法会调用(或者执行)我们传递给它的函数。这是JavaScript中回调函数的典型用法,它在jQuery中广泛被使用。

下面是另一个JavaScript中典型的回调函数的例子:

var朋友=[“Mike",“Stacy",“Andy",“Rick"];      朋友。forEach(函数(eachName、索引){   控制台。日志(指数+ 1 +“。“;+ eachName);//1。迈克,2。史黛西,3。安迪,4。瑞克   });

再一次,注意到我们讲一个匿名函数(没有名字的函数)作为参数传递给了<代码> forEach 方法。

到目前为止,我们将匿名函数作为参数传递给了另一个函数或方法。在我们看更多的实际例子和编写我们自己的回调函数之前,先来理解回调函数是怎样运作的。

因为函数在JavaScript中是第一类对象,我们像对待对象一样对待函数,因此我们能像传递变量一样传递函数,在函数中返回函数,在其他函数中使用函数。当我们将一个回调函数作为参数传递给另一个函数是,我们仅仅传递了函数定义。我们并没有在参数中执行函数。我们并不传递像我们平时执行函数一样带有一对执行小括号<代码>()的函数。

需要注意的很重要的一点是回调函数并不会马上被执行。它会在包含它的函数内的某个特定时间点被“回调”(就像它的名字一样),因此,即使第一个jQuery的例子如下所示:

//匿名函数不会再参数中被执行//这是一个回调函数   $ (“# btn_1") .click(函数(){   警报(“Btn 1 Clicked");   });

这个匿名函数稍后会在函数体内被调用。即使有名字,它依然在包含它的函数内通过 <代码>参数对象获取。

都能够将一个回调函数作为变量传递给另一个函数时,这个回调函数在包含它的函数内的某一点执行,就好像这个回调函数是在包含它的函数中定义的一样。这意味着回调函数本质上是一个闭包。

正如我们所知,闭包能够进入包含它的函数的作用域,因此回调函数能获取包含它的函数中的变量,以及全局作用域中的变量。

回调函数并不复杂,但是在我们开始创建并使用回调函数之前,我们应该熟悉几个实现回调函数的基本原理。

在前面jQuery的例子以及forEach的例子中,我们使用了在参数位置定义的匿名函数作为回调函数。这是在回调函数使用中的一种普遍的魔术。另一种常见的模式是定义一个命名函数并将函数名作为变量传递给函数。比如下面的例子:

JavaScript中什么是回调或者高阶函数