閉鎖について調べてみましょう!
MDNの定義
話がちょっと難しい…!解いて理解しよう!
LexicalScoFran?
function init() {
var name = "Mozilla";
function displayName() { // displayName() 은 내부 함수이며, 클로저다.
console.log(name) //Mozilla
}
displayName();
}
init();
上のコードでは、displayName関数にはnameという領域変数はありません.しかしinitを実行するとmozillaは良好な出力を得る.これは、displayName定義時に親スキャンが外部ディレクトリ環境リファレンスに格納されるためです.自分の地域変数はありませんnameではなく、大尉スコフというnameです.
味わう
function makeAdder(x) {
var y = 1;
return function(z) {
y = 100;
return x + y + z;
};
}
var add5 = makeAdder(5);
var add10 = makeAdder(10);
console.log(add5(2)); // 107 (x:5 + y:100 + z:2)
console.log(add10(2)); // 112 (x:10 + y:100 + z:2)
add 5とadd 10は同じmakeAdderを使用しますが、異なるコンテキスト環境を使用するため、異なる結果が得られます.利用する
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()); // logs 0
counter.increment();
counter.increment();
console.log(counter.value()); // logs 2
counter.decrement();
console.log(counter.value()); // logs 1
counterはインスタント実行関数なのでcounterのprivateCounterにアクセスできません.ただし、親の変数privateCounterが外部のディレクトリ環境参照に格納されているため、内部関数changeByはアクセスできます.注-mdn
Reference
この問題について(閉鎖について調べてみましょう!), 我々は、より多くの情報をここで見つけました https://velog.io/@jinn2u/closure에-대해-알아보자テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol