次のスクリーンショットのように、JavaScript には驚くべき関数が時々あります。 この種の関数は、ブラウザがロードされ、呼び出す必要がある限り、自動的に実行されます。この種の関数は、前のクロージャでも説明しました。一般に、即時実行関数と呼ばれます。 即時関数の特徴:
関数フォーマットを即時実行即時実行関数の形式は通常、次のようになります。 # フォーマット 1 (//W3C はこのフォーマットを推奨) (関数 (){ }()) #形式 2 (ただし、これは最も一般的に使用される方法の 1 つです) (関数 (){ })(); 実際、上記からわかるように、関数を即時に実行する場合、関数名は一般に記述されませんが、これはあまり意味がありません。結局のところ、即時関数は関数名を介して呼び出す必要はありません。これは、関数を文字通り定義するときの効果に似ています。 ここで、クロージャと即時実行される関数を組み合わせた例を見てみましょう。 var 楽しい = ( 関数(){ 関数テスト(a,b){ コンソールログ(a+b); } リターンテスト; } )() 関数を即座に実行する他の方法 – 式上記は即時実行関数のフォーマット定義ですが、この関数を実装する他の方法もあります。たとえば、次の方法は上記のフォーマットではありません。 !関数(){ コンソールにログ出力します。 }() 出力は 2 行あります。最初の行は test で、これは関数をすぐに実行した結果です。先頭に追加の行があるため、true が出力されます。 、これは暗黙的な変換中に言及されました。以下は、ブール型で改行を強制します。 ここでもう一つ疑問があります。なぜこのメソッドを実装できるのでしょうか? これがどのように起こるかを分析するために、まず式関数を見てみましょう。 var テスト = 関数(){ console.log("テスト式") } #この宣言の後、どのように使用するのでしょうか?以下のようにtest(); このとき、大胆なアイデアが頭に浮かびました。割り当てられた関数は、() に変数値を追加することで実行できるのに、なぜ直接記述できないのでしょうか。 var テスト = 関数(){ console.log("テスト式") }() ここで、式関数にも即時実行効果があることがわかります。 (追加情報: なぜ undefined があるのでしょうか? この関数自体には戻り値がないため、ブラウザのコンソール パネルに undefined という値が出力されるためです。) 関数の直後に括弧を付けても大丈夫ですか? 関数(){ console.log("テスト式") }() 最後に () を置く前に式前提条件を使用する必要があることがわかります。そうしないと、エラーが報告されます。 実はこの時、私には大胆なアイデアがあったんです!次のメソッドは実際に関数を式関数に変換するので、後続の + () を直接実行できます。そこで、大胆なアイデアが浮かびました。この場合、関数の前にプラス記号 (+) を追加して試してみましょう。 +関数(){ console.log("テスト式") }() プラス記号は次のようになります。
もちろん、いわゆる掛け算や割り算の記号は実現できません。この魔法の効果を持つ別の魔法のキーワード、つまり「新しい」と「空」があります。 新しい関数(){ console.log("テスト式") }() もう一つは、論理演算子||と&&も実装に使用できることです。 ただし、これはその特性に応じて true または false を前に付ける必要があり、単独では使用できません。 1 && 関数(){ console.log("テスト式") }() または 0 || 関数(){ console.log("テスト式") }() この機能を実現できる魔法の記号 (カンマ) もあります。 1,関数(){ console.log("テスト式") }() カンマを使用すると、前の式関数が真か偽かに関係なく、次の式関数が実行されることがわかります。 即時実行される関数はパラメータを取ることができる即時実行される関数には、次のようにパラメータを持つこともできます。 (関数(a,b){ コンソールログ(a,b) })(1,2) 応用この質問は典型的な面接の質問です。まず、次のHTMLを作成します。 <!DOCTYPE html> <html> <ヘッド> <メタ文字セット="utf-8"> <title>テスト</title> </head> <本文> <ul id=”テスト”> <li>これが最初のものです</li> <li>これは2番目です</li> <li>これは3番目です</li> </ul> <スクリプト> var liList = document.getElementsByTagName('li'); (var i=0;i<liList.length;i++) の場合 { liList[i].onclick=関数(){ コンソールにログ出力します。 } }; </スクリプト> </本文> </html> 目的は、ラベルの数をクリックして数値を出力することですが、結果は li がクリックされた時点で for ループはすでに完了しているため、先ほど学習した let キーワードを使用してこれを解決できます。 var liList = document.getElementsByTagName('li'); for(let i=0;i<liList.length;i++) { liList[i].onclick=関数(){ コンソールにログ出力します。 } }; これで問題は解決できますが、即時関数は使用されません。もちろん、関数を即時実行することで修正することもできます。 var liList = document.getElementsByTagName('li'); for(let i=0;i<liList.length;i++) { (関数(a){ liList[a].onclick=関数(){ コンソールにログ出力します。 } })(私) }; すぐに実行される関数は独自の閉じた空間を形成し、他の外部変数の影響を受けないことがわかります。実際、return がある場合は、標準的なクロージャです。 要約するこの記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: el-select のスタイルを変更する方法の詳細な説明: popper-append-to-body と popper-class
>>: HTML に埋め込まれた Flash HTML ウェブページ コードに Flash ファイルを埋め込むソリューション (パート 2)
ダウンロードhttp://nginx.org/en/download.html解凍ダウンロードしたn...
目次前提条件RNはiOSに価値を渡す方法1: ネイティブに値を通常通り渡す方法2: コールバック関数...
目次1. プロジェクト要件次にコーディングを始める1. フロントエンドページを作成する(CSSスタイ...
目次1. フロントエンドルーティングの実装原則2. vue-Routerの基本的な使い方2.1. イ...
アナコンダのインストールAnaconda は、Python の使用を容易にするために作成されたソフト...
この記事は、Element公式サイトとQiniu Cloud公式サイトを使用しています。 eleme...
楽観的ロック楽観的ロックは、主にデータ バージョン記録メカニズムに基づいて実装され、通常はデータベー...
ウェブサイトの解析を高速化するために、動的ページと静的ページを異なるサーバーで解析して、解析速度を向...
Linux ではすべてがファイルなので、Android システム自体は Linux + Java だ...
目次フロントエンド上記のアイデアに従って、ページめくり機能を設計して記述します。バックエンド(Jav...
実稼働環境で Docker を使用する場合、多くの場合、データを複数のコンテナ間で永続化または共有す...
MySQL のフィルタリングのタイミングは、集計関数で使用される where 条件と having ...
中国初のカッター github.com/chokcocoまず、ここに画像があります。純粋な CSS ...
MySQL の MyISAM エンジンと InnoDB エンジンはどちらもデフォルトで B+ ツリー...
この記事では、MySQL 最適化のヒントで重複したエントリを削除する方法を例を使って説明します。ご参...