[ 通常表示 ]  [ 簡易表示 ]  [ シンプル表示 ]

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

無名関数

pointこの用語のポイント

point関数だよ

point名前が付いてないよ

スポンサーリンク

簡単に書くよ

無名関数とは

名無しのゴンベエ関数のこと。
もう少し真面目っぽく書くと

中身の処理は定義されているけど関数名が付けられていない状態の関数のこと
です。

image piyo

詳しく書くよ

順番に見ていきましょう。
まずは予備知識として「関数」について説明します。
「そんなの説明されなくても知ってるよ!」な人は、適当に読み飛ばしてください。

関数は「何かを入れると何かを計算して何かを返してくれるプログラムの部品」です。
一般的には、入力を受けて処理を行い、その結果として出力があります。

無名関数

ついでなので書いておくと、関数に入れる値は「引数」と言います。

無名関数2

関数から出てくる値は「戻り値」です。

無名関数3

ちょっと汚い話で恐縮ですが、人間は、ご飯を食べて、ウンチを出します。

無名関数4

人間が関数だと考えてください。
ご飯に相当するものが引数です。
ウンチに相当するものが戻り値になります。

無名関数5

さて、この関数ですが、普通は

1.関数の定義
2.関数の呼び出し


の流れで使います。

関数の定義は「こんな処理をする関数だよ!」の指定です。
よく分からない人は「関数を作る作業」と考えてください。

無名関数6

関数の呼び出しは「関数よ!処理を実行しろ!」の命令です。
こちらは「関数を動かす作業」と考えてください。

無名関数7

ただし、プログラムの中にある関数は1つだけではありません。
たくさんあるのが普通です。
何も考えずに「関数よ!働け」と命令するのはマズいでしょう。
いろいろな関数が同時に動き出して大パニックになるかもしれません。

無名関数8

そこで関数を定義するときには、関数ごとに名前を付けておきます。
例えば、新しく作った関数に「ピヨ太関数」という名前を付けたとしましょう。

無名関数9

あとは名前を呼べば良いのです。
ピヨ太関数を呼び出す時は「ピヨ太関数よ!働け」と命令します。

これでピヨ太関数だけが動いてくれます。

無名関数10

もったいぶって長々と書きましたが、ここまでの説明のポイントは

関数には名前を付ける

です。
覚えておいてください。

以上を踏まえて、関数を定義したときに名前を付けてない関数が「無名関数」です。
名無しのゴンベエ関数のカッコ付けた呼び名です。

無名関数11

「おいおい、関数には名前を付けるって言ったのは、おまえだろ。『名前を付けていない関数』って、なんだよ!?」と思う人もいるでしょう。
大丈夫です。
最後まで読めば分かります……多分。

気を取り直して、ちょっと考えてみてください。
そもそも関数に名前を付けるのは、どうしてでしょうか。

そうですね。
関数を動かしたいときに「『ピヨ太関数』よ!働け!」と名指しで指示を出すためです。

ということは、ですよ。

名前を呼ぶ必要がないのであれば、名前を付けなくても問題ないはずです。

名前を考えるのだって、それなりに面倒くさい作業です。
やらなくて済むのなら、やらないに越したことはありません。
呼ぶ機会がない名前なら、付けなくたって、いーじゃない。
名前を付ける作業を省略しましょう!

そんな勢いからなのかは分かりませんが

1.関数名がなくても困らない状況において
2.関数名を付けるのを省略した


関数が無名関数です。

以上が、ざっくりとした無名関数の説明です。

本当は、もっと細かい説明もしたいのですけどね。
プログラミング言語ごとに無名関数の書き方や使い方が違ったりするのです。
具体的なことは、あなたが今やっているプログラミング言語の説明をしているところで勉強してください。

……と丸ごと放り投げると「おまえ、本当は分かってないんじゃないの?」と疑われそうなので、JavaScriptにおける無名関数だけ、簡単に説明しておきますね。

まず普通の関数の書き方は、例えば以下のような書き方です。

//関数定義
function func_piyota() {
 alert("piyota");
}

//関数呼び出し
func_piyota();


これは

1.関数「func_piyota」を定義する
2.関数「func_piyota」を呼び出す


の2つの処理をしています。

同じ処理をJavaScriptでは以下のようにも書けます。

//関数定義&変数に代入
var hoge = function func_piyota() {
 alert("piyota");
}

//関数呼び出し
hoge();


これは

1.関数「func_piyota」を定義して変数「hoge」に代入する
2.変数「hoge」(の中にある関数)を呼び出す


の2つの処理をやっています。

ここで、ちょっと考えてみてください。
関数「func_piyota」の「func_piyota」という名前を使っていませんよね。
関数「func_piyota」は定義した直後に変数「hoge」に代入しています。
呼び出す時は、変数「hoge」の名前を使って呼び出しています。

使っていないのですから、省略しましょう。
定義した関数の名前「func_piyota」を消して以下のように書きかえます。

//関数定義&変数に代入
//関数の名前「func_piyota」を消した
var hoge = function () {
 alert("piyota");
}

//関数呼び出し
hoge();


これは

1.関数(名無しのゴンベエ)を定義して変数「hoge」に代入する
2.変数「hoge」(の中にある関数)を呼び出す


の2つの処理をやっています。

定義した関数の名前「func_piyota」を消したことで、元・関数「func_piyota」は名無しのゴンベエ関数になりました。
実は、これでも問題なく動きます。

この話における元・関数「func_piyota」(現・名無しのゴンベエ関数)が無名関数です。

無名関数は、コールバック関数(関数に引数として渡される関数)を定義する際に、よく使います。

※ここから先は完全に余談です。さらに、プログラミングに慣れていない人には、ちょっと難しい話題だと思います。無名関数について何となく分かれば満足な人は読み飛ばしてください。

例えば、関数を引数にとる関数「func_piyoko」が、あったとしましょう。
関数「func_piyoko」の引数として関数「func_piyota」を渡す書き方は以下の通りです。

//関数定義&変数に代入
var hoge = function func_piyota() {
 alert("piyota");
}

//関数を引数にとる関数
func_piyoko(hoge());


これは

1.関数「func_piyota」を定義して変数「hoge」に代入する
2.変数「hoge」(の中にある関数)を関数「func_piyoko」の引数として渡す


の2つの処理をやっています。

次に、先ほどと同じように定義した関数の名前「func_piyota」を消します。
そうすると処理は以下のように書きかえられます。

//関数定義&変数に代入
//関数の名前「func_piyota」を消した
var hoge = function () {
 alert("piyota");
}

//関数を引数にとる関数
func_piyoko(hoge());


これは

1.関数(名無しのゴンベエ)を定義して変数「hoge」に代入する
2.変数「hoge」(の中にある関数)を関数「func_piyoko」の引数として渡す


の2つの処理をやっています。

名無しのゴンベエ関数(無名関数)が出てきましたね。

この処理は、さらに、もう一段階書きかえられます。
変数「hoge」に代入している部分です。

最終的に引数で渡しますからね。
わざわざ一回、変数「hoge」に入れる必要もないでしょう。
関数「func_piyoko」の引数部分に直接、関数定義を書いてしまいましょう。

そうすると処理は以下のように書きかえられます。

//関数定義&引数に指定
func_piyoko(function () {
 alert("piyota");
});


これは

1.関数(名無しのゴンベエ)を定義して関数「func_piyoko」の引数として渡す

の処理をやっています。

いかがでしょう。
JavaScriptに慣れている人は、何となく見慣れた形になったのではないでしょうか。

このように、無名関数はコールバック関数を定義するときに、よく登場します。

image piyo2

一言でまとめるよ

まぁ「無名関数」って単語が出てきたら「名前が付いていない関数なんだな~」と、お考えください。

一番上に戻るよ
スポンサーリンク