인프런 커뮤니티 질문&답변

호갱님의 프로필 이미지
호갱

작성한 질문수

[React / VanillaJS] UI 요소 직접 만들기 Part 1

아코디언 1/6 강좌 클로져 관련 질문입니다.

해결된 질문

작성

·

288

0

안녕하세요 선생님 고급강의 잘보고 있습니다.

잘만들어 주셔서 감사합니다.

 

아코디언 만들기 1/6 을 보다가 궁금한 사항이 있어 질문드립니다.

  const toggleItem = (id: string) => () => {
    setCurrent((prev) => (prev === id ? null : id))
  }

 

아코디언 1/6 강의를 듣다가 가운데 () 가 클로져 라고 하셨는데

가운데에 저렇게 () 를 쓰면 클로져가 되는건가요?

( 제가 프론트엔드 개발자가 아니라서 클로져의 장단점을 몰라서 질문을 드리는것 같습니다. )

 

 

chatgpt 에게 질문을 남겼는데 더욱 이해가 안되어서 질문드렸습니다..ㅎㅎ

아래는 gpt의 답변 입니다.

 

여기서 (id: string) => () => {...}는 두 개의 함수를 연속적으로 정의하고 있습니다.

1.외부 함수: (id: string) => {...} 이 함수는 id라는 문자열을 매개변수로 받습니다.

내부에는 또 다른 함수를 반환하고 있습니다.

 

2. 내부 함수: () => {...} 외부 함수가 반환하는 내부 함수입니다.

외부 함수의 id 매개변수를 사용하여 동작을 수행합니다.

답변 1

3

정재남님의 프로필 이미지
정재남
지식공유자

이 자리에서 클로저의 정의를 자세히 설명해 드리는건 수업의 범위에서 많이 벗어납니다.
하여, 여기서는 질문하신 내용에 대한 최소한의 이해를 돕는 정도로만 소개드려 보도록 하겠습니다.

 

MDN에서는 클로저를 다음과 같이 소개하고 있습니다.

image

이 중 '외부함수'와 '내부함수'의 관계를 클로저라고 하며, 흔히 외부함수에서 선언된 변수나 인자를 내부함수가 참조하는 경우를 일컫습니다.

 

예로, 다음 함수 originalFunc

const originalFunc = (id: string) => () => { console.log(id) }

풀어쓰면 다음과 같습니다.

const orginalFunc = (id: string) => {
  return () => {
    console.log(id)
  }
}

위 코드는 다음과 동작상에 차이가 없습니다.

const orginalFunc = (id: string) => {
  const innerFunc = () => {
    console.log(id)
  }
  return innerFunc
}

이 상태에서 보면, 내부함수인 innerFunc에서 originalFunc의 인자 id를 참조하고 있습니다.
이는 클로저 현상을 활용한 대표적인 사례에 해당합니다.

 

이후 어디선가 originalFunc('abc')를 실행하면 함수 자체가 반환될 뿐이지만,
이 반환된 함수를 변수 a에 담아 다시 호출하면 ( a() ) 그 결과로 abc가 반환될 것입니다.

 

이보다 자세한 내용은 자바스크립트 이론서나 이론강의 등을 통해 학습하시기 바랍니다.

호갱님의 프로필 이미지
호갱

작성한 질문수

질문하기