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)

推薦する

MySQL 起動時に「サーバーは PID ファイルを更新せずに終了しました」というエラーが報告される理由の詳細な分析

多くの人が MySQL の起動時にこのエラーに遭遇しています。まず、このエラーの前提は、サービス ス...

MySQL の union と union all の簡単な分析

データベースでは、UNION キーワードと UNION ALL キーワードの両方が 2 つの結果セッ...

Docker での WSL の構成と変更の問題について

https://docs.microsoft.com/ja-jp/windows/wsl/wsl-...

Dockerの動作モードと原理の詳細な説明

次の図に示すように: 仮想マシンと Docker を使用するとき、「なぜ Docker は VM よ...

CSS 要素で計算されたスタイルを取得します (カスケード/最終スタイル後)

CSS 要素内の計算されたスタイル (つまり、カスケード後の最終的なスタイル) を取得するには、W3...

CSS3はブラウザのスクロールバーのスタイルを変更します

注意: この方法は、Webkit ベースのブラウザにのみ適用されます。ブラウザのスクロールバーが広す...

WeChatアプレットのスワイパードットのドットをスライダーに変更する方法

目次背景ターゲット効果アイデア成し遂げるスワイパーは変更を聞きますカスタムドットモジュール変更イベン...

CSSでnグリッドレイアウトを実装する方法

一般的なアプリケーションシナリオ現在のアプリのインターフェースは基本的に同じであり、グリッドレイアウ...

MySQL 8.0.20 のインストールと設定の詳細なチュートリアル

この記事では、MySQL 8.0.20のインストールと設定方法についての詳細なチュートリアルを参考ま...

Nginx proxy_redirect の使用方法の詳細な説明

今日、Apache の nginx リバース プロキシを実行していたときに、ちょっとした問題に遭遇し...

mysql indexof関数の使用手順

以下のように表示されます。 LOCATE(部分文字列、文字列)文字列 str 内の部分文字列 sub...

Linux システムでのルート ディレクトリ拡張の概要

1. Linuxディスクの状態を確認する df -lh lsblkコマンドは、使用可能なすべてのブロ...

Baotaパネルを再起動すると、「-ModuleNotFoundError: No module named 'geventwebsocket'」というメッセージが表示されます。

背景:サーバーがFlaskプロジェクトをデプロイし、python3をインストールしたため、再起動時に...

圧縮パッケージを使用して Linux 環境に JDK 13 をインストールする方法

JDK とは何ですか?まあ、この質問がわからないのであれば、なぜこれをインストールするのか本当にわか...