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)

推薦する

CSS を使用して同じ親タグの左側と右側に 2 つのボタンを配置する方法

この記事では、主に同じ親タグの左側と右側にある 2 つのボタンの CSS レイアウト方法を紹介し、皆...

Ubuntu 20.04 は Wi-Fi に接続します (2 つの方法)

最近Ubuntu 20.04をインストールしましたが、Wi-Fiに接続できず、Wi-Fiアイコンも表...

Windows (x86、64 ビット) で MySQL 5.7.17 無料インストール バージョンをアップグレードするための詳細なチュートリアル

Laravel 5.4 のデフォルトの utf8mb64 文字エンコーディングをサポートするには、M...

VUEは登録とログインの効果を実現します

この記事の例では、登録とログインの効果を実現するためのVUEの具体的なコードを紹介します。具体的な内...

HTML スペースコードの簡単な分析

HTML についてどれくらい知っていますか? 現在、基本的な HTML コードを学習している場合は、...

LeetCode の SQL 実装 (184. 部門内で最も高い給与)

[LeetCode] 184. 部門最高給与従業員テーブルにはすべての従業員が保存されます。すべて...

MySQLスローログクエリの詳細な説明

遅いログクエリ機能スロー ログ クエリの主な機能は、設定された時間しきい値を超える SQL ステート...

MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化

ウェブサイトやサービスのパフォーマンスは、データベースの設計(適切な言語開発フレームワークを選択した...

Centos7 に Nginx 統合 Lua サンプル コードをインストール

序文私が使用しているパソコンはMacで、OSはmacOS Mojaveです。コンピュータに仮想マシン...

WindowsでのMySQLインストールチュートリアルの詳細な紹介

目次1. ダウンロードする前に理解しておくべき概念2. 必要なバージョンを選択する3. MySQLサ...

JavaScript イベントバブリング、イベントキャプチャ、イベント委任の詳細な説明

1. イベントバブリング: JavaScript イベント伝播のプロセスでは、要素でイベントがトリガ...

Ubuntu 16.04 に nvidia ドライバー + CUDA + cuDNN をインストールする詳細なチュートリアル

準備1. GPUがCUDAをサポートしているかどうかを確認するlspci | grep -i nvi...

HTML に FLASH へのリンクを追加し、すべての主要ブラウザと互換性を持たせる方法

まずコードを見てみましょうコードをコピーコードは次のとおりです。 <div style=&qu...

Windows Server 2019 のセットアップ方法 (画像とテキスト付き)

1. Windows Server 2019 のインストールVmware に Windows Se...

H5ゲームをnginxサーバーにデプロイする方法の詳細な説明

自己学習型ゲーム開発の道において、最も充実した瞬間は、自分でミニゲームを作り、友達と共有して試しにプ...