JavaSrcript役割ドメインチェーン、文法環境と閉パッケージ


定義#テイギ#
JavaScriptの内部関数は、returnが戻った後(生命の終了)でも、外部関数の変数とパラメータに常にアクセスできます.
前提:文法環境Lexical Environment
コードブロック{},関数,およびjsスクリプト全体に対して,対応する文法環境があり,コードでアクセスできないオブジェクトであり,このオブジェクトの属性は我々が内部で定義した変数である.このオブジェクトには、次の2つのセクションがあります.
  • 自己内部の変数属性
  • 外部outer文法環境への参照
  • 役割ドメインチェーンとは、各文法環境が接続されたチェーンであり、チェーンへのアクセスは一方向であり、内向外からしかアクセスできない.例を挙げると、ネスト関数では外部関数は内部関数の私有変数にアクセスできないが、内部関数は外部関数の変量にアクセスできる.原理:各関数(コードブロック)には独自の文法環境があり,その成分は1.独自のプライベート変数記録,2.外部への参照記録が内部への記録を持たないことが作用ドメインチェーンの一方向の原因であり,以下では閉パケットを紹介する.
    例:
    function makeCounter(params) {
         
        let counter = 0
        return function(params) {
         
            return counter++
        }
    }
    

    ここでmakeCounterは、makeCounterの内部にネストされた関数を返します.JavaScriptにネストされた関数は、その外側の関数の変数(役割ドメインチェーンに沿って外側)にアクセスできます.
    counterを作成します
    function makeCounter(params) {
         
        let counter = 0
        return function(params) {
         
            return counter++
        }
    }
    
    let counter = makeCounter()
    

    ポイント、counter makeCounterを使用して作成する場合、makeCounter内部の関数は値returnとしてcounterに与えられます.counterが作成されると同時に、我々の関数文法環境も作成され、その内容は作成時の状況に応じて「コピー」され、makeCounterがreturnという内部関数の後、彼の寿命は終わったはずだが、生成された文法環境はcounterの参照があるため、ゴミ回収器は彼をゴミとして回収しない.しかし、counterと同じ長寿命で、コンテンツが作成時のコピーである新しい構文環境を作成しました.counterを呼び出すと、counterが自己増加していることがわかりますが、このcounterは前の関数宣言内のcounterとは同じではなく、新しい文法環境にあります.
    counter();// 0
    counter();// 1
    counter();// 2
    

    counter 2をもう1つ宣言すると
    let counter = makeCounter()
    let counter2 = makeCounter()
    
    alert(counter()) // 0
    alert(counter2())// 0
    alert(counter === counter2)//false
    

    2つのcounterが異なることがわかります.
    閉パッケージ定義に戻る
    JavaScriptの内部関数は、returnが戻った後(生命の終了)でも、外部関数の変数とパラメータに常にアクセスできます.
    第1の文の内容は作用域の鎖の文法の環境で解釈されて第2の文は例の中で解釈されます
    ごみ回収について
    ごみ回収も文法環境とその内部の変数の回収であり、上述makeCounterのように、関数内部でcounterを宣言するだけで、明らかにこの変数を使用していない場合は、V 8エンジン(chrome,opera)に対してこのcounterを最適化し、debugという変数を試みたときにno such variableに戻る.