JavaScript の基礎: 即時実行関数

JavaScript の基礎: 即時実行関数

次のスクリーンショットのように、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 のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • JS で即時実行される匿名関数の使用状況の分析
  • JS即時実行関数の機能と使い方の分析
  • JavaScriptで即時実行関数の例を詳しく解説
  • JSで即時実行される関数の詳細な説明
  • JavaScript 即時実行関数の使用状況分析

<<:  el-select のスタイルを変更する方法の詳細な説明: popper-append-to-body と popper-class

>>:  HTML に埋め込まれた Flash HTML ウェブページ コードに Flash ファイルを埋め込むソリューション (パート 2)

推薦する

Amoeba を使用して MySQL データベースの読み取り/書き込み分離を実装する方法の詳細な説明

MySQL には読み取りと書き込みを分離するアーキテクチャが多数あります。Baidu のそれらのほと...

Web2.0: 情報過多の原因と解決策

<br />情報の重複、情報過多、情報強迫、パーソナライズされたカスタマイズ、検索エンジ...

MySQL 8.x msi バージョンのインストール チュートリアル (画像とテキスト付き)

1. MySQLをダウンロードする公式サイトのダウンロードアドレス https://dev.mys...

Vueカスタムディレクティブの詳細

目次1. 背景2. ローカルカスタム指示3. グローバルカスタム指示4.1 カスタムコマンドフック関...

Dockerfile を使用したカスタムイメージの構築の実装

目次序文Dockerfile の紹介Dockerfileはイメージプロセスを構築するDockerfi...

MySQLの認可コマンド grant の使い方のまとめ

MySQL 認証コマンド grant の使用方法:この記事の例は MySQL 5.0 以降で実行され...

Docker を使用して Django プロジェクトをデプロイする方法の例

また、Dockerを使用してDjangoプロジェクトをデプロイするのも非常に簡単です。とても良いです...

HTML 選択オプション デフォルトの選択方法

オプションに属性 selected = "selected" を追加すると、それ...

Reactのref属性を深く理解する方法

目次概要1. Refsオブジェクトの作成1.1 React.createRef() 1.2React...

負の距離(共感) - 相互影響の反復プロセス

ネガティブな距離は共感を意味します。序文(疑問の提起):プロダクトマネージャーは機能を把握します。機...

MySQL インデックスの使用方法 (単一列インデックスと複数列インデックス)

1. 単一列インデックスどの列にインデックスを作成するかを選択することは、パフォーマンス最適化プロ...

Dockerコンテナを作成、起動、停止する方法

1. コンテナとは、独立して実行されるアプリケーション、またはアプリケーションのグループとその動作環...

CSS3 とテーブルタグを使用して円軌道アニメーションを実装するためのサンプルコード

html: 実際には、テーブルタグに従っていくつかの実線の円 div を正六角形に配置し、div コ...

JavaScript における継承の 3 つの方法

継承する1. 継承とは何か継承: まず、継承とは関係、つまりクラス間の関係です。JS にはクラスはあ...

Mysql のデッドロックの表示とデッドロックの除去の詳細な説明

序文しばらく前にMysqlのデッドロック問題に遭遇したので、解決しました。問題の説明: Mysql ...