近來接觸了Kotlin還有Swift,發現好多語言都開始支援lambda的寫法,聯想起之前的JavaScript同樣出現了了“箭頭函數”。
所以來找找相關的知識來了解一下這是個怎麼樣的趨勢,而且現在都出現了類似的函數。

以下先來一個範例:

1
2
3
4
5
6
7
8
9
10
11
12
//舊方法1,排序數字(JS預設排法是以char來排序
function sortNum(a, b){
return a - b;
}
[234,45,1,87,234,9,7].sort(sortNum);
//舊方法2
[234,45,1,87,234,9,7].sort(function(a, b){
return a - b;
});

//箭頭函數
[234,45,1,87,234,9,7].sort((a, b) => a - b);

從這個範例來看,我們可以發現幾個重大的發現

  1. 不用想名稱(跟玩遊戲時的第一個卡關點就是想帳號名稱,寫程式也是一樣的!
  2. 增加閱讀性,在同一行程式中直接可以閱讀到內部方法。
  3. 如果sortNum函數只使用一次,那麼使用匿名函數會更好。

其實JavaScript原本就有匿名函數的寫法(舊方法2),但是“箭頭函數”看起來還是比較清爽。
小忠子在學習箭頭函數時覺得很不習慣,但是學會了之後覺得很好寫。
不過在JavaScript中,箭頭函數內部沒有原本的thisarguments變數哦!

課內小知識

有些程式語言對於匿名函數有特別優化,在執行時可以增加效率,減少記憶體使用量。
有些程式語言對於匿名函數只有語法糖的支援,對於效率,記憶體相關的可能不會有太大差別(或是更糟)。
所以當發現程式碼有效率或記憶體相關問題時,這部分可以再深入研究,看看能不能在這方面進行優化。

由於各個語言的特性不同,所以以上言論並非絕對

注意事項

lambda其實就是為了小巧精煉而生,盡可能不要在lambda函數中做太多事情。

1
2
3
4
5
6
7
[234,45,1,87,234,9,7].sort((a, b) =>{
let ia = +a,
ib = +b;
if (a === b) return 0;
else if (a > b) return 1;
else if (a < b) return -1;
});

該範例只是為了盡可能表現出多行的寫法
不過以JS來說,倒是更多時候會在函數內寫很多很多行

知識鏈接

維基百科-匿名函數
知乎-Lambda 表达式有何用处?如何使用?