JS研究ノートの閉鎖、閉鎖とは何か、閉鎖生成条件、閉鎖の質問と分析。

閉鎖

クロージャーについて説明する前に、まず機能を理解しましょう

  • 関数定義段階
    i。メモリ内のストレージスペースを開きます
    ii。このスペース内でまったく同じ文字列として関数本体にコードを配置し
    ます1.検出されたすべての変数が解析されません
    iii。このスペースアドレスをに割り当てます関数名(変数名)

  • 関数呼び出しフェーズ

    i。関数名(変数名)に従って対応するストレージスペースを見つけます
    ii。関数実行スペースを再度開きます
    iii。
    この実行スペースで正式なパラメーター割り当てを実行しますiv。この実行スペースで事前分析します
    v。関数ストレージスペースを格納しますコードを実行スペースにコピーして
    viを実行します。実行が完了すると、開いている実行スペースは破棄されます。

  • 関数呼び出し
    i。各関数呼び出しは実行スペースを開きます
    ii。一度呼び出すと実行スペースが開きます
    iii。コードが破棄されます
    iv。再度呼び出すと実行スペースが再度開かれます
    v。コードは実行後に破棄されます

どのような状況で関数の実行スペースが破壊されないかについて話しましょう

  • 破壊されない関数実行スペース
    i。関数が実行されると、実行スペースが開かれます
    ii。すべてのコードがこの実行スペースで実行されます
    iii。実行が完了すると、関数実行スペースが破棄されます

  • 特別な場合
    i。関数の実行スペースは破棄されません

  • 特別な状況は何ですか
    i。関数が「複雑なデータタイプ」を返す場合
    ii。「複雑なデータタイプ」を受け取る関数の外部に変数があります
    iii。この時点では、関数の実行スペースは破棄されません

  • 破棄されない関数実行スペース
    i。いつ破棄されるか
    ii。外部から受信した変数
    が関数の戻り値を参照しなくなった場合iii。関数実行スペースが破棄される

閉鎖

  • クロージャの生成には3つの必要条件があります(1つは必須です)
    1。関数Bが
    関数A内で直接または間接的に返されます2.関数プライベート変数(プライベートデータ)が関数B内で使用されます3.
    関数A外の変数この機能Bを受け取り、
    破壊されない機能空間を形成します。

  • 閉鎖空間
    1.破壊されないA関数の実行空間を閉鎖空間と呼びます
    。2。関数Aで返された関数Bを関数Aの閉鎖関数と呼びます。3
    。最後の文の公式定義:クロージャー==>関数内の関数

  • クロージャーの特徴(長所と短所は平行)
    1。変数のライフサイクルを延長します。
    長所:実行スペースが破壊されないため、変数が破壊されません。
    短所:実行スペースが破壊されないため、常にメモリ内に存在します
    。プライベート変数の
    利点:クロージャー関数を使用して、関数内のプライベート変数にアクセスします。
    デメリット:実行スペースは破棄されず、常にメモリ内に存在し
    ます。3。プライベート変数を保護します(関数にこの機能がある場合)
    利点:プライベート変数が存在しないように保護します外部アクセス
    デメリット:アクセスしたい場合は、クロージャー機能を使用する必要があります

  • クロージャ機能の欠点は「致命的」
    です。1。メモリスペースに破壊されないものがある
    と、常にメモリ使用量が発生するため、多すぎるとメモリオーバーフローが発生します。3
    。結果はメモリになります。道を譲る

  • クロージャーを使用する場合
    1.変数のライフサイクルを延長する必要がある場合
    2.または特定の関数内のプライベート変数にアクセスする必要がある場合

閉鎖トピック

function fn(i){
    
    
        return function(n){
    
    
            console.log(n + (--i))
        }
    }
  
    var f = fn(2)
    f(3)
    fn(4)(5)
    fn(6)(7)
    f(8)

分析:ここでは、描画方法に従って分析します。これは、より直感的で理解しやすいものです。
解析

function fn(i){
    
    
       return function(n){
    
    
           console.log(n + (i++))
       }
   }

   var f = fn(10)
   f(20)
   fn(20)(40)
   fn(30)(50)
   f(30)

解析

おすすめ

転載: blog.csdn.net/Bob_Yan623/article/details/108836860