JAvascriptの匿名関数の理解(学習)

5715 ワード

最近jsを学んで、匿名の関数に出会って、ネット上でいくつかの資料を探して、後日DOMとJQueryを学んで更に振り返ってよく理解するつもりです
コードは次のとおりです.
(function(){ 
//    jQuery     
})(); 
(function(){ //    jQuery     })(); 

  
匿名関数といえば、まず関数自体からお話しします.関数の定義は次のとおりです.
関数は、入力ごとに一意の出力値を与える「法則」です.
もちろん、これは数学的な定義にすぎません.しかし、コンピュータプログラミング言語では、関数の定義も八九から十まで離れていない.なぜなら、コンピュータ内の関数は、入力されたいくつかのデータを、コード設定の論理操作処理を経て、唯一の出力を返すコード組合せブロックのセットである数学的定義の記述にも似ていることを知っているからです.もちろん、特例として、入力されたデータが空であるか、出力されたデータが空であるか、あるいは両方が空である.
次に,匿名関数に関する概念を初歩的に理解する.
関数宣言(function文)関数を使用するには、まずその存在を宣言する必要があります.最も一般的な方法はfunction文を使用して、次のような関数を定義することです.
コードは次のとおりです.
function abc(){ 
// code to process 
} 
function abc(){ // code to process } 
    ,            ,        。 

view plaincopy to clipboardprint? 
function abc(x,y){ 
return x+y; 
} 
function abc(x,y){ return x+y; } 

 
しかし、どのように関数を定義しても、JS解釈器はそれをFunctionオブジェクトに翻訳します.たとえば、上記の例の関数番号を定義し、次のコードを入力します.
alert(typeof abc);// "function" 

ブラウザからプロンプトボックスがポップアップされ、abcがFunctionオブジェクトであることを示します.ではFunctionの対象は一体何なのでしょうか.
FunctionオブジェクトFunctionオブジェクトはJavaScript内の固有のオブジェクトであり、すべての関数は実際にはFunctionオブジェクトです.この方面の討論について、私たちは次の特別テーマに残します.まず、Functionオブジェクトがコンストラクション関数を直接使用して新しい関数を作成できるかどうかを見てみましょう.答えは肯定的だ.例:
コードは次のとおりです.
var abc = new Function("x","y","return x*y;"); 
alert(abc(2,3)); // "6" 
var abc = new Function("x","y","return x*y;"); alert(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" 

すべてFunctionオブジェクトであり、言い換えれば関数ですが、名前がないという特徴があります.だから私たちは彼らを「匿名関数」と呼んでいます.しかし、彼らには「名前」がないだけに、私たちは彼らを見つけることができません.匿名関数を呼び出す方法の問題を引用した.
匿名関数の呼び出しは関数を呼び出すために、それを位置決めし、参照する方法が必要です.だから、名前を探すのを手伝う必要があります.たとえば、コードは次のとおりです.
var abc=function(x,y){ 
return x+y; 
} 
alert(abc(2,3)); // "5" 
var abc=function(x,y){ return x+y; } alert(abc(2,3)); // "5" 

上の操作は実は別の方法で関数を定義することに等しく、このような使い方は私たちが頻繁に遭遇しています.たとえば、DOM要素イベント処理関数を設定する場合、名前を付けるのではなく、対応するイベントに匿名関数を参照するようにします.
匿名関数の呼び出しには、()を使用して匿名関数を囲み、後に括弧(パラメータリストを含む)を1対追加するjQueryクリップが表示されます.次の例を見てみましょう.
コードは次のとおりです.
alert((function(x,y){return x+y;})(2,3));// "5" 
alert((new Function("x","y","return x*y;"))(2,3));// "6" 
alert((function(x,y){return x+y;})(2,3));// "5" alert((new Function("x","y","return x*y;"))(2,3));// "6" 

多くの人が不思議に思うかもしれませんが、なぜこの方法が呼び出されたのでしょうか.この応用がおかしいと思っている人は、私の以下の説明を見てみましょう.
皆さんは括弧の役割を知っていますか?カッコは、私たちの式を組み合わせてブロック化し、各ブロック、すなわち各ペアのカッコには戻り値があります.この戻り値は、実際にはカッコ内の式の戻り値です.したがって,一対の括弧で匿名関数を囲むと,実際には括弧対が匿名関数のFunctionオブジェクトを返す.したがって,括弧対に匿名関数を加えると,名前付き関数のようにその参照位置が得られる.したがって、この参照変数にパラメータリストを付けると、通常の関数の呼び出し形式が実現されます.
以上の文字表现が分かるかどうかはわかりませんが、やはり理解できない场合は、以下のコードを见てみましょう.コードは次のとおりです.
var abc=function(x,y){return x+y;};//          abc 
// abc constructor       constructor   。    ,           。 
alert((abc).constructor==(function(x,y){return x+y;}).constructor); 
var abc=function(x,y){return x+y;};//          abc // abc constructor       constructor   。    ,           。 alert((abc).constructor==(function(x,y){return x+y;}).constructor); 

PS:constructorとは、オブジェクトを作成する関数です.つまり、関数オブジェクトが表す関数体です.
要するに、(カッコに含まれる匿名関数)をカッコ式で返される関数オブジェクトとして理解し、この関数オブジェクトを通常のパラメータリストとして呼び出すことができます.(前述のエラーでは、関数式のみが直接関数を呼び出すことができない場合、匿名関数のカッコを外すには、式の割り当てを伴う必要があります.すなわち、(function(){alert(1)})()は、a=function(){alert(1)}()と等価であり、a=さえ取り除くことはできません.)
閉包閉包とは何ですか.閉パッケージとは、あるプログラム言語のコードブロックが1級関数の存在を可能にし、1級関数で定義された自由変数が解放されないまで、1級関数が解放される前に、1級関数の外にもこれらの解放されていない自由変数が適用されることを意味する.
どうですか.汗をかいているように見えるでしょう・・・大丈夫です.私も(私は知っていますが、表現力の問題です).さらに簡単な方法で説明します.パッケージを閉じるというのは、プログラム設計言語で関数をオブジェクトと見なすことができ、オブジェクト内の操作のように関数に運んでインスタンス(ローカル)変数を定義することができ、これらの変数は関数に関数のインスタンスオブジェクトが破棄されるまで保存することができます.他のコードブロックは、これらのインスタンス(ローカル)変数の値を何らかの方法で取得し、拡張を適用することができる.
このように説明してからもっとはっきりするかどうか分かりませんが、まだ分からない場合は、閉パッケージとは、プログラム言語で実行されている関数で定義されているローカル変数をコードで呼び出すことができることを意味します.
次に、コードの例を示します.
var abc=function(y){ 
var x=y;//         
return function(){ 
alert(x++);//                       x,        
alert(y--);//               
}}(5);//     
abc();// "5" "5" 
abc();// "6" "4" 
abc();// "7" "3" 
alert(x);//   !“x”   ! 

var abc=function(y){var x=y;//これは局所変数return function(){alert(x++);//ここで閉パケット特性の1次関数局所変数のxを呼び出してalert(y−);//参照パラメータ変数も自由変数}(5)//abc();//を初期化する"5""5"abc();//"6""4"abc();//"7""3"alert(x);//間違いを報告します!「x」は定義されていません!
ここを見て、jQueryのコードクリップが閉じているかどうかを判断できますか?
  .閉包特性が適用されているかどうかは、セグメントコードに最も重要な要素:破棄されていないローカル変数があるかどうかを決定する必要があります.実装されていない匿名関数が閉パケット特性を適用することは明らかである.しかし、匿名関数には実現がありますか?それはまた、その実装に破棄されていない局所変数が使用されているかどうかを決定しなければならない.だからもしあなたにその冒頭のjQueryコードの断片がJSの中のどんな特性を応用したのかと聞いたら?匿名関数と匿名関数の呼び出しにすぎません.しかしながら、閉パケットの特性が隠されており、いつでも閉パケットアプリケーションを実現することができる.JSは生まれながらにしてこの特性を持っているからです!