Javascript閉パッケージ関数の理解

6134 ワード

クローズドパッケージコンセプト
  • にはA関数があり、A関数の内部にはB関数
  • が返される.
  • 再A関数外部変数参照このB関数
  • B関数内部はA関数内部のプライベート変数
  • にアクセスする.
    関数の役割ドメイン(閉パッケージの事前知識)
    パッケージを閉じる前に関数をレビューします.関数には2つの段階があります.a.定義段階、b.呼び出し段階です.閉包関数をマスターするには必ず理解しなければならない.
    関数定義フェーズ
  • ストレージスペース
  • を開く
  • 関数内のコードをそっくりこの空間内に置く(変数を解析しない)
  • 記憶空間のアドレスを関数名
  • に与える.
    関数呼び出しフェーズ
  • 関数名のアドレスに従って関数の記憶空間
  • を見つける.
  • 形パラメータ
  • 事前解析
  • メモリに実行空間を開く
  • 関数記憶空間のコードを取り出し、開いたばかりの実行空間で
  • を実行する.
  • の実行が完了すると、メモリに開いている実行スペースは
  • 破棄されます.
    function fn() {
      console.log('   fn   ')
    }
    
    fn() 
    
  • 関数が実行されると、実行空間(xxff00ととりあえず呼ぶ)
  • が開きます.
  • console.log(' fn ')このコードはxxff00という空間で
  • を実行する.
  • コードの実行が完了すると、このxxff00空間は
  • を破棄する.
    関数実行スペース
  • 各関数には、記憶領域
  • がある.
  • しかし、呼び出しのたびに全く異なる実行空間
  • が生成される.
  • であり、実行空間は関数の実行が完了すると破棄されるが、記憶空間は
  • ではない.
  • では、この関数空間が実行されると破棄されます.何の意味がありますか.
  • この空間を破壊しない方法があります
  • 閉パケットは、この破棄されない実行空間
  • を利用する.
    関数実行領域を破棄しない
  • 関数の実行スペースは、関数の実行が完了すると、
  • が破棄されます.
  • しかし、関数の内部に参照データ型が戻ると、関数の外部に変数が受け入れる場合
  • .
  • では、この関数実行空間は
  • を破棄しません.
        function fn() {
          var num = 100
          console.log('     ')
          //            
          return [1, 2, 3]
        }
        // res         fn            (    )
        //   => res        fn              xxff11
        var res = fn()
        /*
          res        fn            
            +          ,                
            +              ,            
            +               
        */
    
        res = null
        /*
            res        ,     xxff11           
            +                    ,        
            +               
        */
    

    クローズドパッケージ
    破棄しないスペース
  • 閉パケットの最初の条件は、空間を破棄しない論理
  • を利用することである.
  • は、1つのオブジェクトデータ型
  • を返すにすぎない.
  • ではなく、関数データ型
  • を返します.
    
        function a() {
          //    num        a      
          var num = 100
          return function b() {
            console.log(num)
          }
        }
        // res      a           
        // res         a              (  b)
        //        a          
        var res = a()
        //      , res           a         b
        //   res       
        res()
        //   res      ,    num
        //           a           num   
    
    

    どのようにして閉パッケージを生成しますか?
  • は、ネストされた内部関数が親関数の属性に定められ、参照されると、閉パケットを生成する.
  • クローズを生成するには、ネストされた関数と、サブ関数が親関数の属性または変数を参照してクローズを生成する必要があります.

  • クローズドパッケージの特徴
  • なぜ特徴と呼ぶのかは、彼のすべての点が長所であり、欠点でもあるからだ.
  • 変数のライフサイクルを延長
  • の利点:実行空間が破棄されないため、変数も破棄されない
  • の欠点:実行領域が破棄されないため、メモリに
  • が常に存在する.
  • は、関数内部のプライベート変数
  • にアクセスすることができる.
  • の利点:閉包関数を使用して関数内部のプライベート変数
  • にアクセスできる.
  • の欠点:実行領域は破棄されず、メモリに
  • が常に存在する
  • プライベート変数(関数であればこの特徴がある)
  • を保護
  • の利点:外部からのアクセスからプライベート変数を保護する
  • 欠点:アクセスする場合は、閉パッケージ関数
  • を使用する必要があります.
    閉じた関数の欠点は致命的です
  • メモリ領域に破壊されないものがある場合、
  • が存在するからです.
  • ではメモリ消費量が発生し、多すぎるとメモリオーバーフロー
  • につながる.
  • では、結果としてメモリリーク閉パケットの役割
  • である.
  • は、変数の宣言サイクルを延長する必要がある場合に
  • です.
  • または関数内部のプライベートデータにアクセスする必要がある場合
  • 閉パッケージ関数を使用して
  • を解決できます.
    キーワード:閉パッケージ関数