関数は JavaScript で最も柔軟なオブジェクトです。ここではその匿名関数の使用法のみを説明します。無名関数:関数名のない関数です。
関数の定義は大きく分けて次の 3 つの方法があります。
最初のタイプ: これも最も一般的なタイプです
1 2 3 |
|
2 番目の方法: このメソッドは Function コンストラクターを使用し、パラメーター リストと関数本体の両方を文字列として扱います。これは非常に不便なので、お勧めできません。
1 |
|
3 番目のタイプ:
1 |
|
「=」の右側の関数は無名関数であることに注意してください。関数を作成した後、関数は変数 square に代入されます。
匿名関数の作成
最初の方法は、上で述べたように二乗関数を定義することであり、これも最も一般的に使用される方法の 1 つです。
2 番目の方法:
1 2 3 |
|
ここ (最初の括弧内) で匿名関数が作成され、2 番目の括弧を使用して匿名関数を呼び出し、パラメーターを渡します。括弧は式であり、式には戻り値があるため、括弧の後に
を追加できます。自己実行匿名関数
1. 自己実行匿名関数とは何ですか?
これは次のような関数を指します: (function {// code})();
2. 質問
(function {// code})(); は実行できるのに、function {// code}(); がエラーを報告するのはなぜですか?
3. 分析
(1) まず、この 2 つの違いを理解する必要があります。
(function {// code}) は式、function {// code} は関数宣言です。
(2) 次に、js の「プリコンパイル」の特徴:
js の「プリコンパイル」フェーズでは、関数宣言は解釈されますが、式は無視されます。
(3). js が function() {//code}(); を実行するとき、function() {//code} は「プリコンパイル」段階で解釈されているため、js は function(){/ /code} をスキップします。 (); を実行しようとしているため、エラーが報告されます
jsが(function {// code})();を実行すると、(function {// code})は式なので、戻り値が関数なので、jsはそれを解いて戻り値を取得します。 ;、実行されます。
さらに、関数を式に変換する方法は、必ずしもグループ化演算子 () に依存するわけではありません。void 演算子、~ 演算子、! 演算子も使用できます。
例:
1 2 3 |
|
匿名関数とクロージャ
クロージャを意味する英語はクロージャです。クロージャは JavaScript の知識の非常に重要な部分です。クロージャを使用すると、コードの量が大幅に削減され、コードがより明確に見えるなどの効果があるためです。つまり、クロージャは非常に強力です。
クロージャの意味: 端的に言えば、クロージャは関数の入れ子です。たとえ外側の関数が実行されていても、内側の関数は外側の関数のすべての変数を使用できます (これには JavaScript スコープ チェーンが関係します)。
1 2 3 4 5 6 7 |
|
この例は非常に単純に見えますが、実行プロセスを注意深く分析すると、まだ多くの知識ポイントがあります。checkClosure 関数の実行は瞬時に行われ (おそらく 0.00001 ミリ秒しかかかりません)、変数 str が関数本体に作成されます。 setTimeout の匿名関数が str への参照を持っているため、 checkClosure の実行後に str は解放されません。 2 秒後、関数本体内の匿名関数が実行され、str が解放されます。
クロージャを使用してコードを最適化する:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
匿名関数の最大の用途は、クロージャ (JavaScript 言語の機能の 1 つ) を作成することです。また、名前空間を構築してグローバル変数の使用を減らすこともできます。
1 2 3 4 5 6 7 8 |
|
このコードでは、addEvent 関数とremoveEvent 関数はローカル変数ですが、グローバル変数 oEvent を通じてそれを使用できます。これにより、グローバル変数の使用が大幅に削減され、Web ページのセキュリティが強化されます。
次のコードを使用します:
1 2 3 4 5 6 7 8 9 |
|
ここでは変数 Rainman を作成し、匿名関数を直接呼び出すことでそれを 5 に初期化します。この小さなトリックは場合によっては非常に実用的です。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
このコードの変数 1 はローカル変数 (関数内で定義されているため) であるため、外部からアクセスできません。ただし、ここでは変数 one にアクセスできる inner 関数を作成し、グローバル変数 external は inner を参照するため、outer を 3 回呼び出すと増分結果がポップアップされます。
注意
1 クロージャにより、内部関数は親関数内の変数を参照できますが、変数は最終値です
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
你会发现当鼠标移过每一个
解决方法一:
1 2 3 4 5 6 7 8 |
|
解决方法二:
1 2 3 4 5 6 7 |
|
解决方法三:
1 2 3 4 5 6 7 8 9 |
|
2 内存泄露
使用闭包十分容易造成浏览器的内存泄露,严重情况下会是浏览器挂死