【JSベースシリーズ】閉パックとは


今日はシリーズ第2編で、主に閉鎖に関する問題について話します.閉パッケージの問題は、実質的に役割ドメインの問題だと思いますので、まず役割ドメインに関する問題からお話しします.

役割ドメインとは?


役割ドメインは、変数がアクセスできる管理範囲(または変数の管理範囲)です.例を挙げます:クラスの中で大掃除の準備をして、班長はクラスの当直生に掃除の任務を手配します.小明さんはトイレの掃除を担当し、紅さんと丁さんは教室の掃除を担当し、小龍さんは運動場の衛生を担当しています.では、明ちゃんの管理範囲はトイレエリアで、小龍さんの管理範囲は運動場エリアだと言えます.言い換えれば、明ちゃんの役割ドメインはトイレで、小龍の役割ドメインは運動場です.
一般的な役割ドメインは、文法的役割ドメイン(静的役割ドメインとも呼ばれる)と動的役割ドメインに分けることができ、jsでは一般的に文法的役割ドメインである.

文法の役割ドメインとは何ですか。


まず定義を与えます:文法の作用ドメインは変数あるいは関数が定義する時その管理範囲を確認して、変えません.要約すると、関数が見える限りアクセスできます.乾いた概念は見ていてつまらないですか?例を見てみましょう
function a(x){
    var y = x + 4
    function fn(z){
        console.log(z)
    }
    fn(10 * y)
}
a(4) //80
console.log(y) //y is not defined

上記は、非常に一般的な役割ドメインの例です.a(4)出力の値は80であり,yを出力する際にエラーを報告し,エラー情報は変数yで見つからなかった.このコードを役割ドメインの知識で分析します.
  • グローバル役割ドメイン:
  • 関数a作用域:x,y
  • 関数fn作用域:z
  • したがって、変数yの管理範囲はa関数にあり、グローバル役割ドメインでyの値を出力するのは、明らかに彼の管理範囲にないので、エラー(変数が見つからない)を報告します.ここでもう一つ重要な知識点は、変数のライフサイクルです.

    変数のライフサイクルとは?


    私たちは変数を人間と比較して、例えば人のライフサイクルは人が生まれてから死ぬまでの過程を指します.変数のライフサイクルは、変数の作成から死亡までのプロセスです.変数のライフサイクルから区別すると、グローバル役割ドメインと関数役割ドメインに分けることができます.まず次の定義を与えます.

    グローバル役割ドメイン


    変数の役割ドメインはグローバルであり、グローバル役割ドメインと呼ばれます.

    関数のスコープ


    変数は関数体でのみ定義され、関数役割ドメインと呼ばれます.
    上の例では、変数がグローバル役割ドメインと関数役割ドメインの下にあることを示します.グローバル役割ドメインと関数役割ドメインの変数は、プログラムの実行中にどのようなプロセスを経験しますか.
  • グローバル役割ドメインの変数が定義されると、アクティブに破棄しない限り、プログラムが停止するまでメモリに保存されます.
  • 関数の役割ドメインの変数は、関数の実行中に関数から離れた後に破棄されます.

  • したがって,グローバル役割ドメインで変数yが見つからないのは,a関数を実行した後,変数yが存在しないためである.しかし,技術的実装からは,関数を離れた後に関数の役割ドメイン内の変数が破棄されないように実現できる方法があり,それは閉パケットである.

    閉鎖とは何ですか。


    千呼万喚が出てきて、やっとこの文章の主役に会った.上記では,関数を離れた後に関数の役割ドメインにアクセスできる変数という機能を実現するために閉パケットというものを導入した.閉鎖という機能がどのように実現されるかはさておき、まずこれを定義しましょう.
    ネット上で一般的な定義は、他の関数の内部変数にアクセスできる関数です.私は他の言い方と比較して、やはりこれが頼りになります.これは、関数を離れた後も関数の役割ドメインにアクセスできる変数というニーズに関連しています.どうやってやったの?栗を見る:
    function fn(){
        var a = 10
        return function say(b){
            console.log(a + b)
        }
    }
    var getVal = fn()
    getVal(5)

    これは典型的な閉パケットの書き方です.関数の内部には宣言関数が返されます.fnの実行後に戻り値をgetValに割り当て、getValを実行します.getValを実行するときに実際に実行されるのは関数sayであり、関数sayの役割ドメインはそれを宣言するときに決定されることがわかります.a,b変数にアクセスする権限があり,最後にa+bの値を印刷し,15を印刷する文法的役割ドメインが見られる.
    したがって、ここでの閉パッケージは、fn関数を実行した後、変数aをメモリに保存し、変数aのライフサイクルをグローバル変数と同じようにメモリに永遠に格納する能力がある.しかし、変数aはプライベートであり、getValという関数だけがアクセスでき、他のグローバル変数のように自由にアクセスできず、自由に変更されます.では、自然に閉パッケージにこのような利点があることがわかります.

    クローズドパッケージの利点

  • は、関数から離れた後も関数の変数にアクセスし続けることができ、変数はメモリに保存されます.
  • 閉パケットの変数はプライベートであり、閉パケット関数のみがアクセスできます.外の変数や方法で汚染されません.

  • クローズドパッケージの一般的な使い方

  • モジュール化パッケージ
  • を用いる.
    次はindexです.jsはm.jsモジュールの内容を参照する
    //   :m.js
    (function(){
        var name ='Lucy'
        var getName = function(){
            ...
        }
        exports.mode = {
            name,
            getName
        }
    })()
    
    //   index.js
    var {mode} = require('./m.js')
    mode.getName()
  • ブロックレベルの役割ドメイン
  • を模倣する.
    //    :  5 5
    for(var i=0; i<5; i++){
        console.log(i)
    }
    
    //    :  0-4
    for(var i=0; i<5; i++){
        (function(j){
            console.log(j)
        })(i)
    }

    クローズドパッケージの欠陥

  • メモリの使用量が増加し、パフォーマンスに影響します.
  • 正しく閉パッケージを使用しないとメモリが漏れる
  • .

    まとめ


    本章の主な内容を振り返る
  • 役割ドメイン:変数がアクセスできる管理範囲を指し、生活中の地域管理と結びつけて理解しやすい.
  • 語法役割ドメイン:変数は定義時にその管理範囲を確定し、これ以上変化しない.
  • 変数のライフサイクル:変数が生成されてから破棄されるまでのプロセス
  • グローバル役割ドメイン:役割ドメイングローバル
  • 関数の役割ドメイン:変数は関数体で定義された
  • のみです.
  • 閉パッケージ:他の関数の内部変数にアクセスできる関数
  • 閉パケットの本質は、実行関数が内部に戻る関数に変数Aを付与することであり、文法的役割ドメインによれば、変数Aは内部関数と同様にその役割ドメイン内の変数にアクセスする権限があるため、閉パケット内の変数は破棄されず、メモリに保存され、外部関数による内部変数へのアクセスが実現される.

  • 変数の回収、役割ドメインチェーン、実行コンテキスト、変数の向上などの知識点もあります.紙面の問題で詳細な展開がないため、これは後期に関連するテーマの補充があります.

    参考記事

  • https://juejin.im/post/5afb0a...
  • https://juejin.im/post/5b081f...
  • https://segmentfault.com/a/11...
  • https://www.jianshu.com/p/6c6...