この記事では、JSの匿名関数の作成方法と呼び出し方法を分析します。参照のためにそれを共有してください。特定の実装方法は次のとおりです。
匿名関数は、名前のない関数であり、閉鎖とも呼ばれ、指定された名前のない関数を一時的に作成できます。ほとんどの場合、コールバックパラメーターの値として使用されますが、多くの初心者は匿名関数について知りません。ここで分析しましょう。
関数関数名(パラメーターリスト){function body;}
匿名関数を作成している場合は、次のようにする必要があります。
function(){function body;}
それは匿名の関数であるため、通常、彼に渡されるパラメーターはありません。
なぜ匿名関数を作成するのですか?匿名関数はどのような状況で使用されますか?匿名関数には2つの一般的なシナリオがあります。1つはコールバック関数、もう1つは関数を直接実行することです。
Ajaxの非同期操作などのコールバック関数には、コールバック関数が必要です。ここでは詳しく説明しません。直接機能を実行することに関して、例を見た後、私はそれを理解します:
次のようにコードをコピーします:<スクリプト言語= "javascript">
var a = "a";
(関数(){
var a = "b";
アラート(a);
})();
アラート(a);
</script>
上記のコードでは、2つのアラートボックスが順番に出力されます。最初のアラートボックスの内容はBで、2番目のボックスはaです。利点はありますか?正しいことに、関数実行を使用すると、変数の範囲を制限して、異なるスクリプトの同じ変数が共存できるようになります。
以下では、まず匿名関数に関連する概念を理解しましょう。
関数ステートメント。関数を使用するには、まずその存在を宣言する必要があります。使用する最も一般的な方法は、次のような関数ステートメントを使用して関数を定義することです。
次のようにコードをコピーします:function abc(){
//処理するコード
}
function abc(){//処理するコード}
もちろん、機能はパラメーターを使用したり、返品値を使用したりすることもできます。
コードコピーは次のとおりです。PlainCopyからClipboardPrintを表示しますか?
関数ABC(x、y){
x+yを返します。
}
関数abc(x、y){return x+y; }
ただし、関数をどのように定義しても、JSインタープリターはそれを関数オブジェクトに変換します。たとえば、上記の例のいずれかの関数番号を定義し、次のコードを入力します。
次のようにコードをコピーします:alert(typeof abc); // "function"
ブラウザがプロンプトボックスをポップアップし、ABCが関数オブジェクトであることをプロンプトにします。では、関数オブジェクトは正確には何ですか?
関数オブジェクト
関数オブジェクトはJavaScriptの固有のオブジェクトであり、すべての関数は実際には関数オブジェクトです。まず、関数オブジェクトがコンストラクターを直接使用して新しい関数を作成できるかどうかを見てみましょう。答えはイエスです。例えば:
コードコピーは次のとおりです。VARABC= new Function( "x"、 "y"、 "return x*y;");
アラート(ABC(2,3)); // "6"
私は誰もが今関数を宣言する方法をある程度理解するべきだと思います。では、匿名関数とは何ですか?
匿名関数を宣言します
名前が示すように、匿名関数は実際の名前のない関数です。たとえば、上記の例で関数の名前を削除し、それが関数であるかどうかを決定します。
コードを次のようにコピーします:alert(typeof function(){}); // "function"
alert(typeof function(x、y){return x+y;}); // "function"
alert(typeof new function( "x"、 "y"、 "return x*y;")// "function"
alert(typeof function(){}); // "function"
alert(typeof function(x、y){return x+y;}); // "function"
alert(typeof new function( "x"、 "y"、 "return x*y;")// "function"
それらはすべて関数オブジェクトであることを簡単に確認できます。つまり、それらはすべて関数ですが、すべてが名前のない1つの特徴を持っています。したがって、それらを「匿名関数」と呼びます。ただし、まさに「名前」がないため、それらを見つける方法はありません。これにより、匿名関数を呼び出す方法の問題が拡張されます。
匿名関数を呼び出します
関数を呼び出すには、それを見つけて参照する方法が必要です。したがって、名前を見つける必要があります。例えば:
次のようにコードをコピーします:var abc = function(x、y){
x+yを返します。
}
アラート(ABC(2,3)); // "5"
上記の操作は、実際には関数を異なる方法で定義することと同等です。この使用法は、より頻繁に遭遇するものです。たとえば、DOM要素イベントハンドラー関数を設定するとき、通常は名前を付けず、代わりに対応するイベントに匿名関数への参照を与えます。
実際には、匿名関数を呼び出す別の方法があります。これは、()を使用して匿名関数を囲み、ブラケットのペア(パラメーターリストを含む)を追加するjQueryフラグメントです。次の例を見てみましょう。
コードを次のようにコピーします。Alert((function(x、y){return x+y;})(2,3)); // "5"
alert((new function( "x"、 "y"、 "return x*y;")(2,3)); // "6"
多くの人が、なぜこの方法をうまく呼ぶことができるのか疑問に思うかもしれません。このアプリケーションが奇妙だと思われる場合は、以下の私の説明をご覧ください。
括弧の役割を知っていますか?ブラケットは私たちの表現をチャンクに分けることができ、それぞれのピース、つまりブレースの各ペアには返品値があります。この返品値は、実際には括弧内の式の返品値です。したがって、匿名関数を一対のブラケットで囲むとき、括弧は匿名関数の関数オブジェクトを返します。したがって、ブラケットペアに匿名関数を追加することは名前付き関数のようなものであり、その参照位置を取得します。したがって、この参照変数の後にパラメーターリストを追加すると、通常の関数の呼び出し形式が実装されます。
上記のテキストを理解できるかどうかはわかりません。それでも理解できない場合は、次のコードを見て試してみてください。
コードを次のようにコピーします:var abc = function(x、y){return x+y;}; //匿名関数オブジェクトをABCに割り当てます
// ABCのコンストラクターは、匿名関数のコンストラクターと同じです。つまり、2つの関数の実装は同じです。
alert((abc).constructor ==(function(x、y){return x+y;})。コンストラクター);
PS:コンストラクターとは、オブジェクトを作成する関数を指します。つまり、関数オブジェクトで表される関数本体です。
要するに、ブラケット式によって返される関数オブジェクトとして(ブラケットに含まれる匿名関数)を理解し、この関数オブジェクトに通常のパラメーターリスト呼び出しを行うことができます。 (私は以前にここで間違いを犯しました。関数式のみを直接呼び出すことはできません。匿名の関数ブラケットを削除し、式で割り当てる必要があります。
閉鎖
閉鎖とは何ですか?閉鎖は、最初のレベルの関数の存在を可能にする特定のプログラミング言語のコードブロックを指し、第1レベルの関数で定義された自由変数をリリースできません。第1レベルの関数がリリースされるまで、これらの未発表のフリー変数は、第1レベル関数の外側に適用できます。
どうやって?汗をかいていた...大丈夫だったので、私はそうしました(私はそれを理解していますが、それはただの表現能力の問題でした)。簡単に説明しましょう。閉鎖は実際には言語機能です。関数をオブジェクトと見なすことを可能にするプログラミング言語を指し、次にインスタンス(ローカル)変数をオブジェクトの操作などの関数で定義できます。これらの変数は、関数のインスタンスオブジェクトが破壊されるまで、関数に保存できます。他のコードブロックは、これらのインスタンス(ローカル)変数の値を何らかの方法で取得し、アプリケーションに適用できます。
このように説明した後、それがより明確になるかどうかはわかりません。まだ理解していない場合は、それを簡素化しましょう。閉鎖は、実際にプログラミング言語の実行機能で定義されているローカル変数を参照してください。
それでは、例を見てみましょう。
次のようにコードをコピーします:var abc = function(y){
var x = y; //これはローカル変数です
return function(){
alert(x ++); //これは、Xが閉鎖機能の第1レベルの関数ローカル変数で呼び出され、それで動作する場所です
alert(y - ); //参照されたパラメーター変数もフリー変数です
}}(5); //初期化
ABC(); // "5" "5"
ABC(); // "6" "4"
ABC(); // "7" "3"
アラート(x); //エラー! 「X」は定義されていません!
これを見た後、jQueryのコードスニペットが閉鎖であるかどうかを知ることができますか?
私の意見では、それについて話しましょう。閉鎖機能が適用されているかどうかにかかわらず、このコードの最も重要な要素が未着開のローカル変数であるかどうかを判断する必要があります。その後、閉鎖機能を実装せずに適用することは不可能であることは明らかです。しかし、匿名関数に実装がある場合はどうなりますか?また、その実装には、未着開のローカル変数があるかどうかを判断する必要があります。それでは、jQueryコードスニペットの開始時にJSのどの機能が使用されているかを尋ねた場合はどうでしょうか。次に、匿名関数と匿名関数への呼び出しです。ただし、閉鎖の特性を意味し、いつでも実装できます。
最も一般的な使用法:
次のようにコードをコピーします:(function(){
アラート(「水」);
})();
もちろん、パラメーターも含めることができます。
次のようにコードをコピーします:(function(o){
アラート(o);
})('水');
匿名関数でチェーンズコールを使用したいですか?非常にシンプル:
次のようにコードをコピーします:(function(o){
アラート(o);
return arguments.callee;
})( 'Water')( 'Down');
あなたはすべての一般的な匿名関数を知っています、珍しい機能を見てみましょう。
次のようにコードをコピーします:〜(function(){
アラート(「水」);
})(); //書き込みは少しクールです〜
void function(){
アラート(「水」);
}(); //最も効率的であると言われています〜
+function(){
アラート(「水」);
}();
-関数(){
アラート(「水」);
}();
〜function(){
アラート(「水」);
}();
!関数(){
アラート(「水」);
}();
(関数(){
アラート(「水」);
}()); //少しの強制実行〜
この記事がみんなのJavaScriptプログラミングに役立つことを願っています。