JS匿名関数
3378 ワード
<body onload=“alert(’http://www.baidu.com/')<>上記の例から、js匿名関数の実行はOloadの前であることが分かりますが、Oloadの動作を空関数に置き換えられますか?
js匿名関数の書き方はn種類もあります.名前の通り、匿名関数は実際の名前がない関数です.例えば、上記の例では、関数の名前を消して、彼が関数であるかどうかを判断します.
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要素イベントハンドラ関数を設定する時、私たちは通常名前を決めずに、その対応イベントに匿名関数を引用します.匿名関数の呼び出しには、もう一つの方法があります.つまり、私たちが見たjQuです.eryセグメント——匿名関数を使ってくくり、その後、小さい括弧のペアを追加します.パラメータリストを含めて、以下の例を見てみます.
alert((function(x,y){return x+y;)(2,3)))/"5" alert((new Function)/「6」 alert((function(x,y){return x+y;)(2,3)))/"5" alert((new Function)/「6」
多くの人が、なぜこのような方法で呼び出されたのかというと、おかしいと思う人は以下の説明を見てみましょう.小かっこの役割を知っていますか?小かっこは私たちの表現をブロック化して、各ブロック、つまり小かっこのペアには戻り値があります.この戻り値は実は小かっこの中式です.の戻り値を返します.したがって、匿名関数を1対の括弧で囲むと、実際に小括弧対が返されるのは、匿名関数のFunctionオブジェクトです.したがって、匿名関数を加えると、名前の関数のように引用位置が得られます.したがって、この参照変数の後ろにパラメータリストを追加すると、これが実現されます.普通関数の呼び出し形式です.上記の文字表現が分かりますか?それとも理解できないなら、以下のコードを見てみてください.
var abc=function(x,y){return x+y}//匿名関数オブジェクトをabcに賦与する.
//abcのconstructorは匿名関数のconstructorと同じです.つまり、2つの関数の実現は同じです.
alert((abc).constructor=(function(x,y){return x+y])
PS:constructorとは、オブジェクトを作成する関数のことです.つまり、関数オブジェクトに代表される関数のことです.つまり、括弧式で返される関数オブジェクトとして認識して、この関数オブジェクトに正常なパラメータリストを適用します.(前のエラーがありました.関数式だけでは関数を直接呼び出すことができません.匿名関数括弧を削除するには、表現の割り当てを伴う必要があります.つまり(function(){alert(1)}()はa=function(){alert(1)}()と等価であり、a=でも削除できません.)
包みを閉じる クローズドとは何ですか?クローズドとは、あるプログラム言語のコードブロックが、一級関数の存在を許可し、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"は定義されていません.
ここを見て、jQueryのコードの断片が閉じられているかどうかを判断できますか? 私の理解では、クローズド特性が適用されているかどうかは、このセグメントコードに最も重要な要素があるかどうかを確認しなければなりません.破壊されていない局部変数は、明らかに実現されていない匿名関数によってクローズド特性が適用されることはありません.しかし、匿名関数に実装されている場合は、その実装に破壊されていない部分的変化が使われているかどうかも確認されます.だから、もしあなたにその冒頭のjQueryコードのセグメントがJSのどのような特性を適用しているかを聞いたら、それは匿名関数と匿名関数の呼び出しにすぎません.しかし、クローズドの特性が隠されていて、いつでもクローズドアプリケーションが実現できます.