Javascriptに限らず、多くのプログラム言語で無名関数が使えると思います。以下の2つの記述法は、挙動に違いは全くありませんよね?
function func() {
return "普通の関数です。";
}
var func = function() {
return "無名関数です。";
}
なぜ無名関数を使うのか調べてみたところ、「最近Ajaxが流行ってきてライブラリを使う機会が増えてきた。それらを利用する際、関数の名前が重複して誤作動するのを防げる」という答えを見つけました。しかし試してみたところ
var func = function() {
return "無名関数1です。";
}
var func = function() {
return "無名関数2です。";
}
alert(func());
のように名前が被った場合、従来と同じで後に書かれた関数が動作します。イベント駆動型関数を無名関数にするメリットは分かります。たとえば
window.onload = function() {
alert("ウィンドウの読み込みが完了しました。");
}
と書けば、他の関数との衝突によってこの関数が動作しないことはありません(ライブラリを使ってwindow.onloadが重複してしまったら別問題ですが)。
結局のところ、無名関数を使うメリットは何なのでしょうか?
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
> var func = function() {
> return "無名関数1です。";
> }
funcという変数名が重複しています。
こういう作り方をするなら、変数名も重複しないようにしてください。
(無名関数を使うときは変数に割り当てないというのが一般的です)
> メリット
1回だけ使う関数をわざわざ定義しなくてよいということでしょうか。
function func(arg1, arg2, argf){
return argf(arg1, arg2);
}
function calc(a, b){
return a+b;
}
re=func(5, 3, calc);
alert(re); // 8
re=func(5, 3, function(a,b){return a+b;} );
alert(re); // 8
re=func(5, 3, function(a,b){return a*b;} );
alert(re); // 15
prototype.jsのAjax関連の使い方でよく見かける方法だと思います。
No.3
- 回答日時:
特に私はイベントのために( .onclickとか ) 使ってますが、rabbit_catさんのおっしゃってる
>実際にその関数が使われているところに、その関数の処理が書いてあること。
というのは、例えば、関数abcを定義しておく、として、実際の処理はwindow.onload内で行なうとしましょう。
すると、window.onloadでは、
{
abc();
}
とのみ書かれる事になります。その場合、もし関数abc内にバグが合った場合や書き直す必要がある場合、function abc() と書かれている所まで移動して書き直し、もしそれに伴いwindow.onload内のスクリプトも書き直すとなれば、またwindow.onloadに戻って・・
と非常に作業効率が悪いわけです。切り離されている事が元凶なわけで。
そこでwindow.onload内の最初に、無名関数で関数を定義しておき、すぐ下で使うと、あちこち飛び回る必要もなく、ストレスも溜まりにくいです。
まあそんな感じですね。
No.2
- 回答日時:
JavaScirptはまだ入門レベルなので後回しにして、
たとえば Lisp/Scheme やその他の関数型言語ではリストの全要素に対して
ある関数を適用するということをよくやります。
(map (lambda (x) (* x 2)) list-for-process)
みたいに。この場合、処理する関数は小規模のことが多くまた使う場所も
一箇所に限定されることが多いので、わざわざ名前をつけた関数を使って
名前空間をゴミで埋めるということは避けられる傾向にあるようです。
また、
(define func-hoge(f l)
(map f l))
のような引数として関数をとる関数で行うこともでき、
(func-hoge (lambda (x) (srq x)) list-for-process)
のように呼び出し部分に直接関数を書き下すことができます。
が、JavaScriptでは後者のようなことはできないですよね?
その場合一回無名関数オブジェクトを変数に受けて、その変数経由で
呼び出すという手順になると思います。
多分この辺が変数に無名関数を代入することをやっている理由の一つではないかと思います。
同じ変数でも別の無名関数オブジェクトを代入していれば
違う実体を呼び出すことができるわけですから。
No.1
- 回答日時:
・関数の名前を考える手間がいらないこと。
実は、これはけっこう重要なことだったりする。
・実際にその関数が使われているところに、その関数の処理が書いてあること。
無駄にソースを探しまわる必要がないので、(関数の長さが適度であれば)ソースがみやすくなる。
なるべく、実際に処理が行われる場所の近くに、処理の中身を書く、っていうのはプログラミングの基本です。
回答ありがとうございます。
関数の名前を考える手間がいらないと仰られましたが、変数名がそれにあたるのではないでしょうか?
実際にその関数が使われているところにその関数の処理が書いてあること、というのも従来と変わらない気がします。
var func = function() {} ではなく
window.onload = function() {} のようなイベント駆動型関数に限定して仰られているのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
- JavaScript JavaScriptの即時関数の書き方 1 2022/11/29 09:52
- JavaScript 正規表現について質問です。条件に合う場合はtrueを返したい 3 2022/10/06 23:02
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- JavaScript addEventListener()でリスナー関数に名前を付ける構文を教えてください 1 2023/07/01 17:31
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- JavaScript gasについて 1 2022/05/31 21:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
XMLHttpRequestでキャッシュを...
-
クリックすると上に開くアコー...
-
【JavaScript】二重送信防止
-
jQueryの :not() .not() が有効...
-
XMLHttpRequestオブジェクトが...
-
jslintのエラーについて質問
-
Javascriptの丸括弧の意味
-
同じIDで定義した要素の配列を...
-
google apps scriptの終了のさせ方
-
二次元配列を使って順位をだす...
-
正規表現で半角数字1桁のみを全...
-
<a>タグのテキストを取得
-
undefinedを表示させない方法は...
-
ASP+アクセスでのSQLコメントに...
-
Boolean型配列中のTrueの有無を...
-
ActiveXobjectが作成できない
-
【正規表現】【javascript】CR...
-
javascriptで指定した日時にリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
関数でy=g(x)のgとは何の略です...
-
jslintのエラーについて質問
-
jQueryの :not() .not() が有効...
-
クリックすると上に開くアコー...
-
jQueryのプラグイン「Skitter」...
-
関数名をテキストから読み込む...
-
小数点以下を5刻みで表示
-
XMLHttpRequestでキャッシュを...
-
jQueryでzipを解凍読み込みする...
-
Matlabで自作関数をオーバーロード
-
javascript(jQuery)でセル内...
-
要素名がスペースを含む場合のj...
-
ページ内に複数表がある場合のT...
-
処理前の「お待ちください」
-
JS 頭文字が大文字について
-
HTML5でファイルドラッグ&ドロ...
-
Javascriptリアルタイムエラー...
-
getElementByIdを使用したグロ...
おすすめ情報