"함수의 상위 스코프를 결정한다"
= "렉시컬 환경의 외부 렉시컬 환경에 대한 참조에 저장할 참조값을 결정한다"
MDN에서의 클로저 정의
"A closure is the combination of a function and the lexical environment within which that fuction was declasred"
const increase = (function () {
let num = 0;
// 클로저
return function () {
return ++num;
}
}());
console.log(increase()); // 1
console.log(increase()); // 2
const Person = (function () {
let _age = 0; // private
// 생성자 함수 -> 클로저
function Person(name, age) {
this.name = name; // public
_age = age;
}
// (인스턴스 메서드가 아닌) 프로토타입 메서드 -> 클로저
Person.prototype.sayHi = function() {
console.log(`Hi My name is ${this.name}. I am ${_age}.`);
};
return Person;
}());
const me = new Person('Lee', 20);
me.sayHi(); // Hi My name is Lee. I am 20.
console.log(me.name); // Lee
console.log(me._age); // undefined
+) 여러 개의 인스턴스를 생성할 경우 정보 은닉 완벽하게 지원 X