JavaScript 中的匿名函数是什么?
与其他高级语言一样,JavaScript 也支持匿名函数。从“匿名”一词可以清楚地看出,当函数没有标识符或名称时,该函数被称为匿名函数。匿名函数和普通函数的唯一区别在于,普通函数有名称,而匿名函数没有任何名称。此外,匿名函数用于更简单、更短的应用程序,这些应用程序更容易维护。在本文中,我们将介绍 JavaScript 中的匿名函数是什么,如何使用它们,它们的语法和基本用法以及优缺点。
语法
const EnumType = { variable = function () { function body }; // to call the function 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 promise,我们也可以使用匿名函数来处理错误或 promise 解析。