javascriptの閉鎖を簡単に理解します.

2458 ワード

閉包とは何ですか?作用ですか
関数はその状態すなわち品詞環境に対する参照と共にクローズドを構成します.つまり、クローズドは、内部関数から外部関数のスコープにアクセスすることができます.JavaScriptでは、関数は作成毎にクローズドを生成します.クローズドはしばしば変数に間接的にアクセスするために使用されます.
1.クローズドは、関数とその関数を作成するロケールの組み合わせです.この環境には、このクローズド作成時にアクセスできるすべてのローカル変数が含まれています.
function makeFunc() {
    var name = "Mozilla";
    return function displayName() {
        return name;
    }
}
var myFunc = makeFunc();    //myFunc      
console.log(myFunc());    // Mozilla
2.パッケージを閉じてオブジェクト指向プログラミングで簡単に使用し、オブジェクトはいくつかのデータ(オブジェクトの属性)を一つまたは複数の方法に関連付けることができます.
var Counter = (function() {
    var privateCounter = 0;
    function changeBy(val) {
      privateCounter += val;
    }
    return {
      increment: function() {
        changeBy(1);
      },
      decrement: function() {
        changeBy(-1);
      },
      value: function() {
        return privateCounter;
      }
    }   
  })();

console.log(Counter.value()); // 0 
Counter.increment();
Counter.increment();
console.log(Counter.value());  //2
Counter.decrement();
console.log(Counter.value());  //1
3.サイクル中にクローズドパケットを作成する:一般的なエラーサイクルはすでに実行済みで、arr(3つのクローズドに共有されている)arr[0]はすでにarrの最後の項目の値に等しい.
function foo(){
    var arr = [];
    for(var i = 0; i < 2; i++){
        arr[i] = function(){
            return i;
        }
    }
    return arr;
}
var bar = foo();
console.log(bar[0]());    //2
解決方法は以下の案の一つです.より多くのクローズドを使用します.
function foo(){
    var arr = [];
    for(var i = 0; i < 2; i++){
        arr[i] = makeCallback(i)
    }
    return arr;
}
var bar = foo();
console.log(bar[0]());   //0

function makeCallback(i) {
    return function(){
        return i;
    }
  }
方案二:多すぎるクローズドバッグを使わないで、letキーワードを使ってもいいです.
function foo(){
    var arr = [];
    for(let i = 0; i < 2; i++){
        arr[i] = function(){
            return i;
        }
    }
    return arr;
}
var bar = foo();
console.log(bar[0]());    //0
  • 性能評価は、特定のタスクではない場合は、クローズドパケットを使用する必要があります.他の関数で関数を作成するのは賢明ではありません.なぜなら、クローズドは処理速度とメモリ消費においてスクリプト性能に悪影響を及ぼします.
  • は、Javaなどのプライベートな方法をクローズドでシミュレートすることができます.方法をプライベートとして宣言することをサポートしています.すなわち、同じクラスの他の方法でしか呼び出されません.JavaScriptは、このようなオリジナルサポートはありませんが、プライベートな方法をクローズドでシミュレーションすることができます.具体的には、参照してください.https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
  • ホームページを参照:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures https://zhuanlan.zhihu.com/p/22486908