プロが教えるわが家の防犯対策術!

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件)

> 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関連の使い方でよく見かける方法だと思います。
    • good
    • 3

特に私はイベントのために( .onclickとか ) 使ってますが、rabbit_catさんのおっしゃってる


>実際にその関数が使われているところに、その関数の処理が書いてあること。
というのは、例えば、関数abcを定義しておく、として、実際の処理はwindow.onload内で行なうとしましょう。

すると、window.onloadでは、
{
abc();
}
とのみ書かれる事になります。その場合、もし関数abc内にバグが合った場合や書き直す必要がある場合、function abc() と書かれている所まで移動して書き直し、もしそれに伴いwindow.onload内のスクリプトも書き直すとなれば、またwindow.onloadに戻って・・
と非常に作業効率が悪いわけです。切り離されている事が元凶なわけで。

そこでwindow.onload内の最初に、無名関数で関数を定義しておき、すぐ下で使うと、あちこち飛び回る必要もなく、ストレスも溜まりにくいです。

まあそんな感じですね。
    • good
    • 1

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では後者のようなことはできないですよね?
その場合一回無名関数オブジェクトを変数に受けて、その変数経由で
呼び出すという手順になると思います。

多分この辺が変数に無名関数を代入することをやっている理由の一つではないかと思います。
同じ変数でも別の無名関数オブジェクトを代入していれば
違う実体を呼び出すことができるわけですから。
    • good
    • 0

・関数の名前を考える手間がいらないこと。


実は、これはけっこう重要なことだったりする。

・実際にその関数が使われているところに、その関数の処理が書いてあること。
無駄にソースを探しまわる必要がないので、(関数の長さが適度であれば)ソースがみやすくなる。
なるべく、実際に処理が行われる場所の近くに、処理の中身を書く、っていうのはプログラミングの基本です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

関数の名前を考える手間がいらないと仰られましたが、変数名がそれにあたるのではないでしょうか?

実際にその関数が使われているところにその関数の処理が書いてあること、というのも従来と変わらない気がします。

var func = function() {} ではなく
window.onload = function() {} のようなイベント駆動型関数に限定して仰られているのでしょうか?

お礼日時:2007/08/27 02:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!