HOWTO · JavaScript
JavaScript Lambda 函式
本文將幫助你瞭解 JavaScript 中的 lambda 函式。
本頁內容
在 JavaScript 中,「Lambda 函式」是搜尋 箭頭函式 時常見的用語,並非 JavaScript 的獨立語法構造。箭頭函式提供精簡的函式運算式語法,但在行為上也與一般函式不同,尤其是 this、arguments 和建構實例的方式。
JavaScript 中的 Lambda 函式是什麼?
箭頭函式是使用 => 撰寫的函式運算式。和其他函式一樣,它可以存放在變數中、傳遞給另一個函式,或由另一個函式回傳。若主體只有一個運算式,該運算式的值會自動成為回傳值。區塊主體則使用大括號;若要回傳值,必須明確寫出 return。
箭頭函式的語法與範例
有多個參數時,請在參數外加上括號;只有一個參數時,括號可以省略。例如,const add = (a, b) => a + b 使用運算式主體,而 const add = (a, b) => { return a + b; } 使用區塊主體。若在大括號中省略 return,就不會回傳該運算式的值。
以下 JavaScript 程式會計算總和,並對一小組數值逐一套用函式:
const add = (a, b) => a + b;
const numbers = [1, 2, 3];
const doubled = numbers.map(number => number * 2);
console.log(`Sum: ${add(2, 3)}`);
console.log(`Doubled: ${doubled.join(", ")}`);
提供的執行證據確認,輸出如下:
Sum: 5
Doubled: 2, 4, 6
箭頭函式與一般函式有何不同?
箭頭函式會從周圍的詞法作用域取得 this。它不會建立自己的 this,因此適合用在需要保留外層方法所屬實例的回呼函式中。一般函式的 this 則取決於呼叫方式;若透過 new 建構,則會依建構呼叫設定。
箭頭函式也沒有自己的 arguments 綁定。它不會自動讀取外層函式的 arguments;只有在外層作用域提供該名稱時,詞法查找才可能找到它。若箭頭函式需要收集傳入的引數,請使用 rest 參數,例如 (...items) => items.length。
箭頭函式不能以 new 呼叫,也沒有供建構用途使用的自有 prototype 屬性。一般函式宣告或運算式只要符合用途,就可以作為建構函式。箭頭函式所存放的變數可能會取得推斷名稱,但箭頭函式本身沒有具名函式語法;具名函式運算式是另一種形式。
何時使用箭頭函式
需要詞法 this 的簡短回呼函式很適合使用箭頭函式。例如,items.map(item => item.price) 會將每個項目轉換成其價格,並回傳一個新陣列。若事件回呼需要保留周圍作用域中的 this,箭頭函式也可能很合適。
如果函式需要依呼叫方式取得自己的 this、必須用來建構實例,或使用函式宣告會更合適,請選擇一般函式。在瀏覽器的事件監聽器中,請記得箭頭回呼的 this 不會被設為事件目標;需要取得目標時可使用事件物件,若適合使用由呼叫方式決定的 this,則可改用一般回呼函式。
最佳實務與常見陷阱
箭頭函式的主體應保持簡潔,讓讀者一眼就能理解。若有多個步驟,可使用明確寫出 return 的區塊主體;若具名函式宣告能讓操作更容易辨識,也可以選用它。描述清楚的變數名稱有助讀者理解函式值,但不會因此讓箭頭函式變成具名函式運算式。
不要只因為箭頭語法較短就選用它。詞法 this 在某些回呼中很有用;若函式需要自己的 this,則不適合使用箭頭函式。箭頭函式也可以包含副作用;是否應避免副作用,取決於整體設計,而非箭頭語法本身。
常見問題
JavaScript 中的「Lambda 函式」是什麼意思?
這個詞通常指箭頭函式。JavaScript 使用 => 撰寫這類函式;「Lambda 函式」是常見的搜尋用語,並非獨立的語言構造。
箭頭函式如何處理 this?
它會使用周圍詞法作用域中的 this,不會根據自身的呼叫方式取得新的 this。
箭頭函式可以作為建構函式嗎?
不可以。箭頭函式不能以 new 呼叫。若要建構實例,請使用合適的一般函式或類別。
箭頭函式有哪些優點與限制?
精簡的語法能讓回呼函式更容易閱讀,而詞法 this 可省去重新綁定外層脈絡的需要。如果函式需要自己的 this、自有的 arguments 綁定或建構行為,就不適合使用箭頭函式。需要收集箭頭函式的引數時,請使用 rest 參數。