初学者が躓きやすいラムダ関数(無名関数)、高階関数、コールバック関数あたりのまとめ①
ラムダ関数とは
ラムダ式とは関数を入力として受け取り、出力できる関数式のことを指す
ラムダ関数別名
ラムダ関数は関数リテラル(匿名関数、無名関数)と言われている。
通常の関数とラムダ関数の大まかな違い
通常関数はfunction
で定義されることで、メモリアドレスの中にある読み取り専用のコードセグメントに格納される
それに対してラムダ式で生成される関数のことをラムダ関数という。
ラムダ式によって作られた無名関数はオブジェクトをつくる。
そのオブジェクトを通常の関数と同様に呼び出すことも可能。
例
let ramuda = function(){return "ラムダ"}
上の関数をコンソールログするとわかりやすい。
①
console.log(ramuda)
→[Function ramuda]
みたいなのが出てくる
②
console.log(ramuda())
→ラムダがでてくる
ラムダ関数と通常の関数の保存先
通常の関数
function tujou() { return "通常"}
→ コードセグメントに格納されどこからでも呼び出し可能
ラムダ式でつくられた無名関数
funtion () {return "ラムダ"}
→ どこにも保存されていないのでガベージコレクタによって削除される。
そのため
let ramuda = function(){return "ラムダ"}
と書けば変数に保存されるので呼び出し可能なオブジェクトになる。
コールバック関数、高階関数
高階関数は一言で言えば引数に関数があり、戻り値を出力する関数のこと
例
function kokai(f) {f() + "高階関数だよ"}
的なやつ。
上述の無名関数を引数に入れて使ってみる。
function kokai(function(){return "初学者には難しすぎる!"})
これをコンソールすると
「初学者には難しすぎる高階関数だよ」
がでてくる。
*注意点
引数には無名関数しか入れてはいけない感じが出てるが通常の関数も入力できる
高階関数の次はコールバック。
コールバック関数とは関数Xが入力として渡されて、その受け取った関数Xがもともとの関数Aが実行されている中で呼び出される関数のこと。
そもそもコールバック関数には
①同期的に実行されるもの→中で行われる関数Xがもともとの関数Aの実行中に終わる
②非同期的に実行されるもの→中で行われる関数Xの終了をもともとの関数Aはまたない
の2種類ある。
①は今まで見てきた無名関数のこと
②の例
function callback(f,s) {
console.log("一番最初")
setTimeout(f,s)
console.log("二番目")
}
console.log(callback(function(){console.log("最後にくるよ")},2000);
コンソールには
一番最初→二番目→最後にくるよ
の順番で出力されます。
ただ、非同期で実行される関数はデータの流れがわかりにくくなり、コードの実行の流れがわかりにくくなる可能性がある。(処理がうまく同期していないとすぐに制御不能になるらしい、、ここらへんの理解が微妙)
だからこそ言語によってはプロミスオブジェクトやasync
,await
で強制的に同期化している
明日は、今日の内容に基づいて、ラムダクロージャーやmap
,filter
,reduce
関数についてアウトプットしたい。