分でJavaScriptシリーズを勉強します.


クローズドというと、前端を書いている学生はみんな知っています.実際のプロジェクトでは、多かれ少なかれクローズドが使われていると信じています.一体何がクローズドで、クローズドはどうやって生まれたのですか?
1.何が阮先生の文章に閉じられていますか?
クローズドとは、他の関数の内部変数を読み取る機能です.Javascript言語では、関数内部のサブ関数だけが局所変数を読み取ることができるので、クローズドを単に「関数の内部に定義された関数」と理解することができます.
2.クローズドの役割の一つは、関数内部の変数を読み取ることができます.もう一つは、これらの変数の値を常にメモリに保持させます.
3.簡単な閉鎖例
function count() {
    let num = 0;
    return function add() {
        return ++num;
    }
}
let a = count();
a();  //1
a();  //2
まず、count()の戻りの結果、つまりcount()関数の戻りの関数をaに割り当てます.このとき、count()で定義された局所変数numはメモリに保存されます.a()を初めて呼び出した場合、+num、すなわち1を返します.a()を2回目に呼び出した場合、numは1ですので、戻りの結果は2です.
4.クローズドが発生した原因は多くの人がこの問題に困惑していると信じています.いずれも関数の中で関数を返して、クローズドを形成しています.実はこれはただのクローズドで発生する方法です.原因ではなく、原因を説明します.発生の主な原因はJavaScriptが語法の作用領域であること、すなわち関数定義時に既に作用領域が与えられていることにある.そして運転時には、実際の運転状況に応じて運転時のスコープが与えられます.この二つの作用領域のJS関数を通して正確に実行されます.上記の例では、count()を実行する場合、この関数のスコープは
運転時作用域num=0
語法のスコープ
count()が実行されると、add関数に戻ると、この時点でaddが定義状態にあるため、戻り時に生成されるこの関数の語法作用領域が上記count()の作用領域となる.したがって、a()を実行すると、その真の作用域は
add運転時のスコープ
count運転時の作用域num=0
count品詞法のスコープ
初めてaddを呼び出した時、numは0ですので、1に戻ります.2回目のリターンは2です.
5.上記の説明から総括すると、クローズドを生成する際に、外部関数の局所変数(実行時作用領域)が内部関数としてワード作用領域としてメモリに保存されていることが分かりますので、内部関数が解放される前に、このブロックメモリは解放されません.したがって、クローズドを使用するには、メモリ漏れに十分注意する必要があります.