728x90
일급 객체 first-class object
- 일급 객체란, 다른 변수처럼 대상을 다룰 수 있는 것
- 자바스크립트에서 함수는 일급 객체이다.
- 즉, 자바스크립트에서 함수는 변수처럼 다룰 수 있다.
function add(a, b) {
return a + b
}
// 함수를 다른 함수의 인자로 넘긴다.
[1, 2, 3].reduce(add, 0)
(() => {
console.log('익명 함수를 생성한다.')
})()
function outer(a) {
function inner(b) {
return a + b
} // 중첩 함수를 생성한다.
return inner(10)
}
const Person = (name) => {
// 함수를 변수로 생성한다.
const printName = () => console.log(name)
return { printName }
} // 함수를 리턴하며 closure를 생성한다.
const person = Person('Daniel')
person.printName()
function printName(name) {
console.log('name : ', name)
}
// 함수끼리 비교한다.
// ===의 경우, 변수가 같은 객체(함수)를 가리키는지 체크한다.
console.log(printName === person.printName)
클로저
function createCard() {
let title = "";
let content = "";
function changeTitle(text) {
title = text
}
function changeContent(text) {
content = text
}
function print() {
console.log("TITLE - ", title);
console.log("CONTENT - ", content);
}
return { changeTitle, changeContent, print };
}
const card1 = createCard();
card1.changeTitle("생일카드");
card1.changeContent("생일축하해");
card1.print();
const card2 = createCard();
card2.changeTitle("감사카드");
card2.changeContent("고마워");
card2.print();
- 자바스크립트 클로저는, 함수의 일급 객체 성질을 이용한다.
- 함수가 생성될 때, 함수 내부에서 사용되는 변수들이 외부에 존재하는 경우, 그 변수들은 함수의 스코프에 저장된다.
- 함수와 함수가 사용하는 변수들을 저장한 공간을 클로저(closure)라 한다.
let rate = 1.05;
function app() {
let base = 10;
return function (price) {
return price * rate + base;
};
}
const getPrice = app();
getPrice(120) // 136
- base는 app 함수 내부, rate는 app 함수 외부의 스코프에 존재한다.
- 함수가 참조하는 변수는 실행 시점에 실행 컨텍스트에 의해 스코프가 결정된다.
let rate = 1.05;
function app() {
let base = 10;
return function (price) {
return price * rate + base;
};
}
console.log(app()(1)); // 11.05
rate = 1.1;
console.log(app()(1)); // 11.1
- 스코프에 따라서 변수에 영향을 받는다.
- rate의 변경은 두 클로저 함수 호출에 반영되지만, base는 증가해도 영향을 미치지 않는다.
- base는 app 호출 시 매번 생성되는 반면, rate는 매번 생성되지 않는다.
728x90
반응형
'Front-End' 카테고리의 다른 글
[JavaScript] 자바스크립트 엔진, 변수 정의 과정 (0) | 2023.03.29 |
---|---|
[JavaScript] ES6 Rest, Spread Operator (0) | 2023.03.25 |
[JavaScript] 화살표 함수 / 일반 함수 에서의 this (0) | 2023.03.23 |
[JavaScript] this가 가리키는 것 (0) | 2023.03.22 |
[JavaScript] 실행 컨텍스트 (Execution Context) (0) | 2023.03.22 |