JavaScript自己実行関数(クローズド)

2469 ワード

1.グローバル汚染
変数宣言時に規則があります.繰り返し宣言は無効です.
var num=123;
var num='abc'
繰り返し宣言のコードはエラーを報告しませんが、その宣言の特徴がなくなり、普通の割当文に変換されます.
したがって、上記のコードは以下のコードと等価である.
var num=123;
num='abc';
例:


    var $ = function(selector){
        return document.querySelectorAll(selector);// $     
    };
    $('div').css(...);//  ,  $('div') nodeList  ,  css  
2.クローズド
起因:関数内部で宣言されたデータは、関数外で直接アクセスできません.
包装とは小包、包装という意味です.閉じていると、閉じています.
    クローズドとは、クローズドな特性を持ちつつ、パッケージの特性を持つ構造のことです.
    コードの観点から言えば、いわゆるクローズドは関数です.
①関数内で宣言されている変数は、外部からアクセスできない、すなわち閉じられています.
②関数自体はパッケージ単位であり、関数を利用してコードをカプセル化することができるので、関数もパッケージ構造です.
したがって、関数には小包の特性があり、閉鎖的な特性もありますので、直接関数をクローズドと呼ぶことができます.
関数を実行すると、関数実行のためにメモリ空間が割り当てられます.
関数の実行が終了すると、メモリが解放されます.繰り返し使用できます.
この定義は欠陥がある.
関数内部でデータの参照を外部に戻すと、データが常に占有されていることが保証されます.
function foo(){
    var num = 123;
    function func(){
        return num;
    }
    return func;
}
var f = foo(); 
// f  func,foo      ,  func
// num     ,  f      
3.クローズドとは、関数内で定義された変数のことで、関数外ではアクセスできない関数です.
しかし、クローズドが解決すべき問題は、これらのデータにどのように間接的にアクセスするかである.
関数のデータにどうやってアクセスしますか?
①最も簡単なアクセス方式:戻ります.
function foo(){
var num = 123;
return num;
}
var res1 = foo();
var res2 = foo();
//              
②複数アクセスしたが、fは一回だけ呼び出すことができます.
var res1 = foo();
var res2 = res1;
③関数を関数に戻し、関数を使ってデータを返します.
function f(){
var num = 123;
return function(){
        //       ,     num 
    return num;
    };
}
var foo = f();//   ,      
var res1 = foo();//  num  
var res2 = foo();//        
2次チェーンを0段チェーンに戻し、2段チェーンを利用して1段チェーンの特性にアクセスすることができ、0段チェーンが1段チェーンに間接的にアクセスすることができる.
したがって、このデータは破壊されない、すなわちリリースされない.
リボン:
クローズドとは、関数によって宣言された変数が外部にアクセスできなくなり、関数が閉じられた構造になります.
関数内のデータにアクセスする必要がある場合は、関数を利用して関数を返し、関数内のデータを関数外でこの関数内で返してもいい関数を使って内部のデータにアクセスすることも考えられます.
4.補足:メモリのリリース
jsには一切使われないデータが釈放されます.
5.クローズドの使い方
(1)サンドボックスモードとして
サンドボックス:独立した外界から隔離された運行環境です.
(function(){
    //     ,    ,      ,      
})();
露出モード:
var foo = (function(){
function foo(){}
    return foo;
})();
(2)キャッシュ機能付きの関数
var func = (function(){
    //    
    return function foo(){
    };
})();
//func      
再帰的には、なぜ性能が低いですか?
重複が多すぎて、計算済みのものを保存して、計算していないなら再帰しますが、計算してからまた保存します.