JavaScript で関数を定義するには、通常 3 つの方法があります:
<code>function fnMethodName(x){alert(x);}</code>
<code>var fnMethodName = function(x){alert(x);}</code>
<code>var fnMethodName = new Function('x','alert(x);')</code>
上記の 3 つのメソッドは同じメソッド関数 fnMethodName を定義します。最初のメソッドは最もよく使用されるメソッドで、関数を変数 fnMethodName にコピーします。この関数には名前がありません。つまり、匿名関数です。実際、 のかなりの数の言語に匿名関数 があります。
<code>var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1); };</code>
<code>var y = "global"; function constructFunction() { var y = "local"; return new Function("return y"); <span>// 无法获取局部变量</span> } alert(constructFunction()()); <span>// 输出 "global"</span> </code>
Function キーワード定義と比較すると、Function() コンストラクターには独自の特性があり、使用するのがはるかに難しいため、このテクノロジは通常はほとんど使用されません。関数のリテラル式は、関数のキーワード定義に非常に似ています。前述の違いを考慮すると、OS X 10.4.3 の一部の Webkit エンジンではリテラルの匿名関数にバグがあるというニュースがありますが、通常参照する匿名関数は、関数リテラルの形式での匿名関数を指します。詳細については、『JavaScript: The Definitive Guide, 5th Edition』の関数の章を参照してください。
昨日hedger wangは、 いくつかの匿名関数コード パターンを彼のブログで紹介しました:
エラー モード: 機能せず、ブラウザーは構文エラーを報告します。
<code>function(){ alert(1); }();</code>
<code>(function(){ alert(1); } ) ( );</code>
<code>( function(){ alert(2); } ( ) );</code>
<code>void function(){ alert(3); }()</code>
これら 3 つの方法は同等です。Hedge Wang は個人的な理由から 3 番目の方法を好みますが、実際のアプリケーションでは、私が見て使用したのは最初の方法です。