function outerFn() {
let outerVar = 'outer';
console.log(outerVar);
function innerFn() {
let innerVar = 'inner';
console.log(innerVar);
}
return innerFn;
outerFn()(); //outer, inner (외부 함수와 내부 함수를 연달아 호출)
let innerFn = outerFn(); // outer (외부 함수의 리턴값을 innerFn이라는 변수에 담는다)
innerFn(); //inner (내부 함수가 담긴 innerFn을 호출한다)
유용한 클로저 예제
function adder(x) {
return function(y) {
return x+y;
}
}
var add 5 = adder (5);
// undefined
add5(6)
// 11
var add10 = adder (10);
//undefined
add10(10)
20
//x의 값을 고정해놓고 재사용할 수 있다.
function htmlMaker(tag) {
let startTag = '<' + tag + '>';
let endTag = '</' + tag + '>';
return function(content) {
return startTag + content + endTag;
}
}
let divMaker = htmlMaker('div');
divMaker('code'); // <div>code</div>
divMaker('states'); // <div>states</div>
let h1Maker = htmlMaker('h1');
h1Maker('Headline'); //<h1>Headlines</h1>
function makeCounter() {
let privateCounter = 0;
return {
increment: function() {
privateCounter++;
},
decrement: function() {
privateCounter--;
},
getValue: function() {
return privateCounter;
}
}
}
let counter1 = makerCounter ();
counter1.increment();
counter1.increment();
counter1.getValue(); // 2
let counter2 = makeCounter ();
counter2.increment();
counter2.decrement();
counter2.increment();
counter2.gerValue(); // 1
// 두 카운터에 각기 다른 privateCounter를 다루면서 private Counter를 밖으로 노출시키지 않는다