자바스크립트 언어만의 고유 개념은 아님.
일급 객체로서의 함수 개념이 존재하는 언어에서 사용되는 개념. (js, python, swift, go.. )
렉시컬 스코프(Lexical Scope) 사용
일급 객체 (first-class object): 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체
- 변수에 함수를 할당
- 함수를 인자로 다른 함수에 전달(콜백, 고차함수를 작성하는데 사용)
- 함수를 반환(함수는 값으로 취급. 팩토리, 클로저를 작성하는데 사용)
- 객체의 프로퍼티로 함수를 할당
- 배열의 요소로 함수를 할당 가능
함수를 일급 객체로 취급함으로써 코드를 더 간결하게 짤 수 있고, 모듈화된 형태로 작성 가능하게 해준다.
외부에 있는 변수가 내부에 있는 함수와 함수 호출한 후에도 종료되지 않고 계속 참조 하는 것.
외부의 변수와 내부의 함수가 끊기지 않고 연결고리가 계속 이어져 있는 것.
const external = () => {
let number = 65;
let internal = () => {
let char_ = String.fromCharCode(number);
console.log(char_, number++); // internal 함수 내부에서는 number가 없으므로 상위로 올라가서 number를 찾음
// console.log(number);
};
internal();
};
external(); // A 65
external(); // A 65 ..?
external();
console.log('-----------------------------');
const external2 = () => {
let number = 65;
let internal = () => {
let char_ = String.fromCharCode(number);
return `${char_}: ${number++}`; // 함수형 프로그래밍에서는 자꾸 return 해주는 것이 좋음.
};
return internal();
};
console.log(external2()); // A: 65
console.log(external2()); // A: 65
console.log(external2()); // A: 65 ...
console.log('-----------------------------');
const out = () => {
let number = 65;
let internal = () => {
let char_ = String.fromCharCode(number);
return `${char_}: ${number++}`; // 함수형 프로그래밍에서는 자꾸 return 해주는 것이 좋음.
};
return internal; // 함수의 실행 결과가 아닌 함수 자체를 반환하면 외부와 연결고리가 계속 남게 된다.
};
const out2 = out();
console.log(out2());
console.log(out2());
console.log(out2());
console.log(out2());
// 클로저 사용 x 코드.. 비효율 적으로 리스너 실행때마다 변수 선언, 상태유지 X
document.getElementById("btn").addEventListener("click", function () {
const count = 0;
console.log(count + 1);
});
// 클로저 사용 코드. 불필요한 변수선언 줄이고, 상태 유지 가능
function makeCounter() {
let count = 0;
return function () {
count++;
console.log(count);
}
}
const counter = makeCounter();
document.getElementById("btn").addEventListener("click", counter);