web-dev-qa-db-ja.com

クロージャーと匿名関数(違い?)

可能性のある複製:
PHPまたは素人用語でのJavascript?)のClosures/Lambdaとは?
「クロージャ」と「ラムダ」の違いは何ですか?

こんにちは、

クロージャと匿名関数の違いを明確に説明する定義を見つけることができませんでした。

私が見たほとんどの参考文献は、それらが明確な「もの」であることを明確に指定していますが、その理由を理解することはできません。

誰かが私のためにそれを簡素化してくれませんか?これら2つの言語機能の具体的な違いは何ですか?どのシナリオでどちらが適切ですか?

66

無名関数は、名前のない単なる関数です。これ以上何もない。クロージャは、周囲の環境の状態をキャプチャする機能です。

匿名関数は必ずしもクロージャーを作成する必要はなく、クロージャーは匿名関数に対してのみ作成されるわけではありません。

この仮説的な反例を考えてみましょう。クロージャをサポートしていないが、匿名関数をサポートしている言語Fooを考えてください。 「あいさつ」は内部関数のスコープで定義されていないため、この言語はコンパイルされないか、以下のコードに対してエラーをスローします。匿名であるという事実は無関係です。

function outer() {
    var greeting = "hello ";

    (function(name) {
        alert(greeting + name);
    })("John Doe");
}

JavaScriptのクロージャーをサポートする実際の言語を考えてみましょう。上記と同じ例を取り上げますが、今回は内部関数に名前を付けます:

function outer() {
    var greeting = "hello ";

    (function inner(name) {
        alert(greeting + name);
    })("John Doe");
}

内部関数はもはや匿名ではありませんが、それでも周囲の環境から状態をキャプチャします。

それ以外の場合は関数のすべての依存関係を引数として渡すため、クロージャーは非常に必要な利便性を提供します。

function outer() {
    var greeting = "hello ";

    (function(name, greeting) {
        alert(greeting + name);
    })("John Doe", greeting);
}
90
Anurag