什么是 JavaScript 中的匿名函数?
与其他高级语言一样,JavaScript 也支持匿名函数。从匿名一词可以看出,当函数没有标识符或没有名称时,该函数称为匿名函数。匿名函数和普通函数之间的唯一区别是普通函数有名称,而匿名函数没有名称。此外,匿名函数用于更简单、更短的应用程序,更易于维护。在本文中,我们将介绍什么是 JavaScript 中的匿名函数、如何使用它们、它们的语法和基本用法以及优点和局限性。
语法
const EnumType = { variable = function () { function body }; // 调用函数 variable()
在上面的语法中,我们可以看到使用了 function 关键字,但没有名称。最终函数返回给变量。此变量可用作函数。此外,我们还可以将其分配给其他变量,然后将其用作函数。让我们看一个例子来更好地理解。
示例
<!DOCTYPE html> <html> <head> <title>HTML Console</title> </head> <body> <h3> Output Console </h3> <p> Output: </p> <div id="output"> </div> <div id="opError" style="color : #ff0000"> </div> <script> var content = '' var error = '' var opDiv = document.querySelector('#output') var opErrDiv = document.querySelector('#opError') // actual javascript code try { function normalFunction() { content += "Output from a normal function." + '<br>' } var f = function () { content += "Output from an anonymous function." + '<br>' }; f() normalFunction(); // assign f to some new variable f1 = f f1() } catch (err) { error += err } finally { // display on output console opDiv.innerHTML = content opErrDiv.innerHTML = error } </script> </body> </html>
现在问题来了,如果我们用普通函数和匿名函数做同样的事情,那么为什么我们要使用匿名函数呢?或者为什么我们要使用普通函数而不是匿名函数?答案在以下小节中给出 -
将函数作为参数传递
有时我们将函数(而不是函数调用后的结果)作为另一个函数参数传递。让我们看一个例子,我们在等待 2 秒(2000 毫秒)后打印一行
示例
<!DOCTYPE html> <html> <head> <title>HTML Console</title> </head> <body> <h3> Output Console </h3> <p> Output: </p> <div id="output"> </div> <div id="opError" style="color : #ff0000"> </div> <script> var content = '' var error = '' var opDiv = document.querySelector('#output') var opErrDiv = document.querySelector('#opError') // actual javascript code try { setTimeout( function () { content += "Output is coming after 2 seconds (2000 milliseconds)" + '<br>' opDiv.innerHTML = content }, 2000 ); } catch (err) { error += err } finally { // display on output console opDiv.innerHTML = content opErrDiv.innerHTML = error } </script> </body> </html>
在此示例中,我们使用 setTimeout() 函数,该函数将另一个函数作为参数,并有时等待另一个值,然后执行给定的函数。这里我们使用了 2000,以便等待 2 秒,然后执行匿名函数。
立即执行函数
在某些情况下,我们定义函数并立即执行它们。在这种情况下,匿名函数变得方便。这种语法如下 -
语法
( function (){ //function body } )();
示例
<!DOCTYPE html> <html> <head> <title>HTML Console</title> </head> <body> <h3> Output Console </h3> <p> Output: </p> <div id="output"> </div> <div id="opError" style="color : #ff0000"> </div> <script> var content = '' var error = '' var opDiv = document.querySelector('#output') var opErrDiv = document.querySelector('#opError') // actual javascript code try { ( function () { content += "Execute immediately after declare this function" + '<br>' } )(); } catch (err) { error += err } finally { // display on output console opDiv.innerHTML = content opErrDiv.innerHTML = error } </script> </body> </html>
匿名函数的优点和缺点
匿名函数有时很有用,因为它是内联声明的。这些函数可以完全访问所有当前局部变量,从而简化代码及其设计。而且这不会干扰我们正在使用的任何命名空间(全局、本地、函数内部等)。这只是因为匿名函数没有名称。
在某些情况下,匿名函数不太适合。例如,此事件处理程序中的 addEventListener(type, function),我们无法删除它,因为我们没有此函数的句柄。另一个缺点是,每当我们使用匿名函数时,它都会创建一个新的实例。在某些情况下,我们也可以使用普通函数。在这种情况下,使用匿名函数没有任何区别。在这种情况下,我们可能看不到任何区别,但请考虑我们在一个循环内使用一个函数,并且每次我们都在这个循环内创建一个函数。在这种情况下,如果使用匿名函数,这将是一个主要的性能问题。
结论
Javascript 函数本身很智能。我们可以将函数作为其他函数的参数传递。但有时我们需要对数组的每个元素应用某些操作或类似情况,我们可以将目标定义为匿名函数,为此,不需要任何特殊原因来创建新的标准函数。匿名函数也可以接受参数。对于 javascript 承诺,我们也可以使用匿名函数来处理错误或承诺解决。