1. 無名関数とは何ですか?
JavaScript で関数を定義するには、通常 3 つの方法があります:
関数キーワード (関数) ステートメント:
関数 fnMethodName(x){alert(x);}
関数リテラル ):
var fnMethodName = function(x){alert ( x);}
Function() コンストラクター:
var fnMethodName = new Function('x','alert(x);')
上記の 3 つのメソッドは、同じメソッド関数 fnMethodName を定義します。 1 つ目は最も一般的に使用されるメソッドで、後の 2 つは変数 fnMethodName に関数をコピーしますが、この関数には名前がありません、つまり匿名関数です。実際、かなりの数の言語に匿名関数があります。
2. 関数リテラルと Function() コンストラクターの違い
関数リテラルは匿名関数ですが、構文では任意の関数名を指定できます。再帰関数を作成すると、それを自分で呼び出すことができますが、Function() コンストラクターを使用すると呼び出すことができません。
var f = function fat(x) {
if (x else return x*fact(x-1);
};
Function() コンストラクターで実行時 Javascript が可能になりますコードの動的作成とコンパイル。この点では、グローバル関数 eval() に似ています。
Function() コンストラクターは関数本体を解析し、実行されるたびに新しい関数オブジェクトを作成します。したがって、ループ内で Function() コンストラクターを呼び出したり、頻繁に実行される関数を呼び出したりする効率は非常に低くなります。対照的に、関数リテラルは、検出されるたびに再コンパイルされません。
Function() コンストラクターを使用して関数を作成すると、その関数は通常のスコープに従いません。常にトップレベル関数として実行されます。
var y = "global"; function constructionFunction() {
var y = "local";
return new Function("return y"); // ローカル変数を取得できません
}
alert(constructFunction()( )); // 出力「グローバル」
Function キーワード定義と比較すると、Function() コンストラクターには独自の特性があり、使用するのがはるかに難しいため、このテクノロジは通常はほとんど使用されません。関数リテラル式と関数キーワード定義は非常に似ています。前述の違いを考慮すると、OS X 10.4.3 の一部の Webkit エンジンではリテラルの匿名関数にバグがあるというニュースがありますが、通常参照する匿名関数は、関数リテラルの形式での匿名関数を指します。詳細については、『JavaScript: The Definitive Guide, 5th Edition』の関数の章を参照してください。
3. 匿名関数のコード パターン
昨日、hedger wang がブログで匿名関数のコード パターンをいくつか紹介しました:
エラー パターン: その他 It will'動作しない場合、ブラウザは構文エラーを報告します。
function(){
alert (1) ;
}();
関数リテラル: まず関数オブジェクトを宣言してから、それを実行します。
(function(){
alert(1 );
} ) ( );
優先度式: Javascript は括弧の内側から外側に向かって式を実行するため、括弧を使用して式の実行を強制できます。宣言された関数。
( function(){
alert(2 );
} ( ) );
void 演算子: void 演算子を使用して、かっこで囲まれていない単一のオペランドを実行します。
void function(){
アラート(3 );
}()
これら 3 つの方法は同等です。hedger wang は個人的な理由から 3 番目の方法を好みますが、実際のアプリケーションでは、私が見て使用したのは最初の方法です。
4. 匿名関数の適用 《
JavaScript のモジュール モード》の最初の文は「グローバル変数は悪魔です」です。匿名関数を var キーワードと組み合わせると、グローバル変数を汚染することなく Javascript がページ上に書き込まれることを効果的に保証できます。これは、見慣れないページに Javascript を追加する場合に非常に効果的かつエレガントです。実際、匿名関数は YUI とそれに対応するパラダイムで広く使用されており、他の Javascript ライブラリでも広く使用されています。
JavaScript は関数型プログラミングの基礎です。詳細については、「
関数型プログラミング手法を使用した美しい JavaScript の記述」および「
関数型 JavaScript プログラミング ガイド》。