//예시 1
const x = 1;
function foo() {
const x = 10;
// scope chain에 의해 바깥쪽 scope인 foo를 찾는다
// bar의 LexicalEvironment outer에 foo를 기억한다
// 따라서 10에 먼저 접근
function bar() {
console.log(x);
}
}
foo();
//예시2
const x = 1;
function foo() {
const x = 10;
// 상위 스코프는 함수 정의 환경(위치)에 따라 결정된다.
// 함수 호출 위치와 상위 스코프는 아무런 관계가 없다.
bar();
}
// 함수 bar는 자신의 상위 스코프, 즉 전역 렉시컬 환경을 저장하여 기억한다.
function bar() {
console.log(x);
}
foo();
bar();
const x = 1;
// 1
function outer() {
const x = 10;
const inner = function () {
console.log(x);
};
return inner;
}
const innerFunc = outer();
innerFunc();
outer
함수를 호출하면 중첩 함수 inner
를 반환(return)한다가비지 컬렉터
덕분!예제1
// 카운트 상태 변경 함수 #1
let num = 0;
const increase = function () {
return ++num;
};
console.log(increase());
// num = 100; // 치명적인 단점이 있다
console.log(increase());
console.log(increase());
예제2
// 카운트 상태 변경 함수 #2
const increase = function () {
let num = 0;
return ++num;
};
// 이전 상태값을 유지 못함
console.log(increase()); //1
console.log(increase()); //1
console.log(increase()); //1
예제3
// 카운트 상태 변경 함수 #3
const increase = (function () {
let num = 0;
// 클로저
return function () {
return ++num;
};
})();
// 이전 상태값을 유지
console.log(increase()); //1
console.log(increase()); //2
console.log(increase()); //3
예제4 (decrease 추가)
// 카운트 상태 변경 함수 #4
// 클로저 카운트 기능 확장(값 감소 기능 추가)
const counter = (function () {
//카운트 상태 변수
let num = 0;
// 클로저인 메서드(increase, decrease)를 갖는 객체를 반환한다
// property는 public -> 은닉되지 않는다
return {
increase() {
return ++num;
},
decrease() {
return num > 0 ? --num : 0;
},
};
})();
console.log(counter.increase()); // 1
console.log(counter.increase()); // 2
console.log(counter.decrease()); // 1
console.log(counter.decrease()); // 0
예제5
// 생성자 함수
function Person(name, age) {
this.name = name; //public
let _age = age; //private
// 인스턴스 메서드
// 따라서, Person 객체가 생성될 때 마다 중복 생성됨
// : 해결방법 -> prototype
this.sayHi = function () {
console.log(`Hi! My name is ${this.name}. I am ${_age}.`);
};
}
const me = new Person("Choi", 33);
me.sayHi(); // Hi!, My name is Choi. I am 33.
console.log(me.name); // Choi
console.log(me._age); // undefined
const you = new Person("Lee", 30);
you.sayHi(); // Hi! My name is Lee. I am 30.
console.log(you.name); // Lee
console.log(you.age); // undefined
프로퍼티
와 메서드
를 하나로 묶는 것