Javascript クロージャの使用シナリオの原則の詳細

Javascript クロージャの使用シナリオの原則の詳細

1. 終了

Javascriptでは、関数内のサブ関数のみがローカル変数を読み取ることができ、クロージャは他の関数内の変数を読み取ることができる関数です。

たとえば、次のコード:

関数f1() {
    var n = 999;
    関数f2() {
    コンソールにログ出力します。
    }
    f2 を返します。
}
var 結果 = f1();
結果();//999

関数 f2 は関数 f1 に含まれており、f1 内のすべてのローカル変数は f2 から参照できます。しかし、その逆は当てはまりません。f2 内のローカル変数は f1 からは見えません。

これは、 Javascript言語に特有の「 chain scopeスコープ」構造です。子オブジェクトは、一度に 1 レベルずつ、すべての親オブジェクトの変数を検索します。したがって、親オブジェクトのすべての変数は子オブジェクトに表示されますが、その逆はできません。

f2 は f1 内のローカル変数を読み取ることができるため、f2 が戻り値として使用されている限り、その内部変数は f1 の外部で読み取ることができます。

2. クロージャの使用シナリオ

1.タイムアウトを設定する

ネイティブsetTimeoutによって渡される最初の関数にはパラメーターを指定できませんが、パラメーターを渡す効果はクロージャーを通じて実現できます。

関数 f1(a) {
    関数f2() {
        コンソールにログ出力します。
    }
    f2 を返します。
}
var fun = f1(1);
setTimeout(fun,1000);//1秒後に1を出力します

2. コールバック

動作を定義し、それをユーザー イベント (クリックまたはキー押下) に関連付けます。コードは通常、コールバック (イベントがトリガーされたときに呼び出される関数) としてイベントにバインドされます。

たとえば、次のコード:

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>テスト</title>
</head>
<本文>
    <a href="#" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" id="size-12">12</a>
    <a href="#" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" id="size-20">20</a>
    <a href="#" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" id="size-30">30</a>

    <script type="text/javascript">
        関数 changeSize(サイズ){
            関数()を返す{
                document.body.style.fontSize = サイズ + 'px';
            };
        }

        var size12 = changeSize(12);
        var size14 = changeSize(20);
        var size16 = changeSize(30);

        document.getElementById('size-12').onclick = size12;
        document.getElementById('size-20').onclick = size14;
        document.getElementById('size-30').onclick = size16;

    </スクリプト>
</本文>
</html>

数字をクリックすると、フォントサイズが対応するサイズに変わります。

3. 手ぶれ補正機能

コールバックはイベントがトリガーされてから n 秒後に実行されます。n 秒以内に再度トリガーされた場合は、タイミングが再開されます。

実装の鍵はsetTimeOut関数にあります。タイミングを保存するための変数が必要なので、グローバルな純粋性を維持するために、クロージャを使用して実装できます。

次のコードに示すように:

/*
* fn [関数] 手ぶれ補正を必要とする関数* delay [数値] ミリ秒、手ぶれ補正の期限値*/
関数デバウンス(fn,delay){
    タイマーを null にする
    //クロージャの助けを借りて return function() {
        if(タイマー){
            clearTimeout(timer) //この分岐ステートメントを入力すると、タイミング プロセスが現在進行中であり、同じイベントが再度トリガーされることを示します。したがって、現在のタイミングをキャンセルしてタイミングを再開するには、timer = setTimeOut(fn,delay) を使用します。 
        }それ以外{
            timer = setTimeOut(fn,delay) // このブランチに入るということは、現在タイミングがないことを意味し、タイミングを開始します}
    }
}

4. プライベート変数をカプセル化する

次のコードに示すように: jsを使用してカウンターを作成する

方法1:

関数f1() {
    var 合計 = 0;
    var obj = {
       inc:関数() {
           合計++;
           合計を返します。
       }
};
    obj を返します。
}
結果を f1() とします。
console.log(result.inc());//1
コンソール.log(result.inc()); //2
console.log(result.inc());//3

返されたオブジェクトには、ローカル変数 x を保持するクロージャが実装されており、変数 x には外部コードからまったくアクセスできません。

方法2:

関数f1() {
    var 合計 = 0;
    関数f2() {
        合計++;
        f2 を返します。
    }
    f2.valueOf = 関数(){
        合計を返します。
    };
    f2.toString = 関数(){
        sum+'' を返します。
    };
    f2 を返します。
}
//関数f1を実行し、関数f2を返す
コンソール.log(+f1());//0
コンソールログ(+f1()()) //1
コンソール.log(+f1()()()) //2


すべてのjsデータ型には、 nullを除く2つのメソッドvalueOftoStringがあります。

  • valueOf()メソッド: 指定されたオブジェクトのプリミティブ値を返します。
  • toString()メソッド: オブジェクトの文字列表現を返します。

数値演算では、最初にvalueOfが呼び出され、文字列演算では、最初にtoStringが呼び出されます。
sum+' 'は文字列型データです

Javascript クロージャの使用シナリオに関するこの記事はこれで終わりです。より関連性の高い Javascript クロージャのコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • js クロージャの 9 つの使用シナリオ
  • JS の閉鎖原則とその使用シナリオの分析

<<:  ソフトウェア 404 と 404 エラーとは何か、またそれらの違いは何ですか

>>:  MySQLデータベースを使い始めるための最初のステップはテーブルを作成することです

推薦する

Firefoxでリンクをクリックしたときに点線の枠線を削除する方法

今日、ブラウザの互換性の問題にいくつか遭遇しました。そのうちの 1 つは奇妙に感じました。Firef...

ウェブページの右下隅に「いいね!」カード効果を実現するための CSS (サンプルコード)

効果 HTML を実装するには、まずクリーンな HTML ページを準備し、ノードを記述します。 &l...

画像マーキー効果を実現するネイティブJS

今日は、ネイティブ JS で実装された画像マーキー効果を紹介します。効果は次のとおりです。 実装され...

Vue3 手動カプセル化ポップアップ ボックス コンポーネント メッセージ メソッド

この記事では、ポップアップボックスコンポーネントメッセージのVue3手動カプセル化の具体的なコードを...

Linux システム AutoFs 自動マウント サービスのインストールと構成

目次序文1. サービスプログラムをインストールする2. メイン設定ファイルを書く3. サブ構成ファイ...

CentOS 7.9 の zabbix5.0.14 のインストールと設定プロセス

目次1. 基本的な環境設定2. データベースをインストールする3. zabbix関連コンポーネントを...

Nginx リバース プロキシはポート 80 のリクエストを 8080 に転送します

まず、一連の概念を理解しましょう。nginx リバース プロキシとは何でしょうか?リバース プロキシ...

MySQLのページング制限のパフォーマンス問題についての簡単な説明

MySQL ページング クエリは通常、制限を通じて実装されます。 limit は 1 つまたは 2 ...

CentOS 環境で NFS リモート ディレクトリ マウントを使用する手順の紹介

目次1. NFS の概要2. NFS構築1. NFSサーバーの構築2. NFSクライアントの構築3....

MySQLコマンドラインでSQLファイルを実行するいくつかの方法

目次最初の方法: MySQLデータベースが接続されていない場合2 番目の方法: データベースがすでに...

WeChatアプレットはシンプルな計算機を実装する

WeChatアプレットの簡単な計算機は参考用です。具体的な内容は次のとおりです。 1. はじめに1....

Docker が占有するディスク領域をクリーンアップする方法

Docker は多くのスペースを占有します。コンテナを実行したり、イメージを取得したり、アプリケー...

MySQL の乗算と除算の精度の不一致の問題 (除算後の小数点以下 4 桁)

質問今日、プロジェクト関数を書いていたとき、金額の統計計算を行い、単位を変換する必要がありました。そ...

MySQL テーブルタイプ ストレージエンジンの選択

目次1. 現在のデータベース支出のストレージエンジンを表示する方法1:方法2: 2. ENGINE=...

Docker イメージを削除できません エラー: そのようなイメージはありません: xxxxxx 解決策

序文docker イメージを削除できません。docker docker imagesを確認すると、イ...