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 解析。