Javascriptの戻り関数とクローズド


Javascriptには類の概念がなく、関数は第一類のオブジェクトです.
関数はオブジェクトで、主な表現形式は以下の通りです.
1.関数は実行時に作成することができます.実行中に作成することもできます.
2.関数は他の変数に割り当てられ、それらの参照を他の変数にコピーできます.
3.関数はパラメータとして他の関数に渡すことができ、他の関数の戻り値として返すこともできます.
4.関数は自分の属性と方法があります.
本論文では、戻り値の形式として関数を重点的に議論する.
たとえば:

    var  setup = function()
    {
        //  setup     
         var count = 0;
        //          
         return function()
        {
            return (count += 1);
        };
    };
        //        
         var next = setup();
        alert(next()); //1
        alert(next()); //2
        alert(next()); //3
        alert(next()); //4
以上のコードを通して、2つの現象が見られます.
1.変数countは関数setupのプライベート変数です.外部関数は直接アクセスできませんが、関数setupの内部匿名関数を通じてアクセスできます.この内部関数を返すと、関数setupのプライベート変数に間接的にアクセスできます.
2.関数セットのプライベート変数countは静的変数のように見えますが、呼び出しごとに前回の呼び出しに基づいて1ずつインクリメントできます.
現象1:Javascriptでは、関数には二つの特別な特徴があります.一つは前に述べた関数が対象で、二つは関数が局所的な作用領域を提供します.これはJava中の{}が提供する変数のスコープとは違います.
Javascriptにおけるスコープアクセスモード:
 
    //     
    var global = "global";

    function outer()
    {
        //  outer    
        var outer_v = "outer";
       alert(global); //global,           
        alert(inner); //undefined,              
        
        var inner = function()
        {
            //  inner    
              var inner_v = "inner";
            alert(outer_v); //outer,             
        }
    }

    alert(outer_v); //undefined,     oute        。
以上のコードはJavascript言語特有の「連鎖作用領域」構造を説明するためです.サブオブジェクトは、すべての親オブジェクトの変数を1段階ずつ上に探します.したがって、親オブジェクトのすべての変数は、子オブジェクトに対しては見えますが、逆は成立しません.
現象2:なぜ関数セットのプライベート変数countの表現はJavaの静的変数のようですか?

     var next = setup();
この言葉が呼び出された後、大域変数nextが関数setupの内部関数を指すようになりました.だから、setupの内部関数はずっとメモリに存在します.ゴミ回収器に回収されません.内部関数の存在は外部関数setupに依存するため、setupは破壊されずにメモリに存在します.したがって、プライベート属性の値はリセットされません.特に、Javascriptでは関数はクラスではなく、最初のクラスのオブジェクトです.つまりオブジェクトです.メモリの中に破壊されないオブジェクトが存在するため、オブジェクトの属性は変更されません.これはJavaでの静的変数とは違います.
これらの関数オブジェクトはメモリに存在しているので、戻り関数を自由に使用することは、非常に消費されます.
実は上で述べたこの戻り関数のパターンは、Javascriptの中のいわゆるクローズドです.
クローズドの概念:
公式」の説明は、クローズドは多くの変数とこれらの変数を結びつける環境を持つ表現であり、これらの変数もこの式の一部であるということです.
私の理解では、クローズドとは関数の外部で関数内部の返却関数を使うことです.
すなわち、関数aの内部関数bが関数a以外の変数によって参照されると、クローズドパケットが作成される.
クローズドの役割は主にプライベート変数を保護するためです.
クローズドの使用に関する注意事項:
1.クローズドは関数の変数がメモリに保存されるため、メモリの消耗が大きいので、クローズドを濫用してはいけません.そうでないと、ウェブページの性能問題が発生し、IEでメモリの漏洩を引き起こす可能性があります.
2.Javascriptの特殊な作用領域チェーンのため、親関数の外部に閉包され、親関数の内部変数の値を変更します.