JavaScript/匿名関数

前へ:関数 インデックス 次へ:関数。 オブジェクト指向プログラミング

匿名関数は、それを参照するための名前付き識別子なしで宣言された関数である。

通常の関数定義:

function hello() { alert('Hello world');}hello();

匿名関数定義:

var anon = function() { alert('I am anonymous');}anon();

匿名関数がよく使われるのは、他の関数への引数とするものです。

Use as an argument to other functions:

setTimeout(function() { alert('hello');}, 1000);

Above, the anonymous function is passed to setTimeout, which will execute the function in 1000 milliseconds.これは無名関数が1000ミリ秒後に実行されることを意味します。

クロージャとしての使用:

(function() { alert('foo');}());

上記の匿名ステートメントの内訳:

  • 周囲の括弧は匿名関数のラッパーです
  • 末尾括弧は関数への呼び出しを始め、引数を含むことができます

前の例を書いて同じ結果を得る別の方法です。

(function(message) { alert(message);}('foo'));

上記の別の表現では、開始波括弧を関数自体ではなく、周囲の波括弧に配置しますが、これは、そもそもなぜ周囲の波括弧が必要なのかについて混乱を引き起こします。

(function() { // …})();

周囲の中括弧ではなく、関数を開始する場所に周囲の中括弧の内側に戻すよう奨励するために、後続の中括弧に軽蔑的な名前を付けるという手段もあります。

匿名関数は、ローカル変数 arguments.callee を介して自分自身を参照することができ、再帰的な匿名関数に便利です。

// returns the factorial of 10.alert((function(n) { return !(n > 1) ? 1 : arguments.callee(n - 1) * n;})(10));

しかしながら、arguments.callee は ECMAScript 5 Strict では非推奨です。 arguments.callee の問題点は、tail recursion (JavaScript の将来の計画) を実現できなくなることと、異なる this 値になることです。 arguments.callee を使用する代わりに、名前付き関数式を使用できます:

// returns the factorial of 10.alert( (function factorial(n) { return (n <= 1) ? 1 : factorial(n - 1) * n;})(10) );

矢印関数式は、他のプログラミング言語ではラムダと呼ばれるものに似ており、2015年の ECMAScript 6 で導入されたものです。 これは、匿名関数を作成するための略記法を提供します。

例:

  • x => x + 1
    • x + 1を返す1引数の匿名関数。
  • x => {return x + 1}
    • 上記のように、しかし関数本体があるものです。
  • (x, y) => x + y
    • 2アールのアロー関数。
  • (x, y) => {return x + y}

リンク:

  • 関数 # The_arrow function expression、開発者。mozilla.org
  • Functions/Arrow functions、developer.mozilla.org