클로저

·2024년 6월 12일

자바스크립트

목록 보기
9/21
post-thumbnail

메모

커링

first() 함수가 함수를 반환한다면 first()() 를 통해 실행할 수 있다. => 커링(Currying)
ㄴ first()(매개변수) 도 된다! ( = 안에 든 함수가 만약 second 라면 second(매개변수) 한 거랑 같다.

클로저 : 가비지컬렉터 히히 못 가.

함수가 태어난 렉시컬 환경을 기억해서 이 함수가 어떤 스코프에서 호출이 되든 이 스코프에 접근할 수 있게 해주는 것.

함수는 함수와 함수가 생성된 렉시컬 환경의 조합입니다. 이를 통해서 함수가 생성된 환경의 변수들에 접근할 수 있고 함수가 호출된 스코프에 상관없이 원래의 렉시컬 환경에 접근할 수 있다.

function howclosure(){
  let x = 0;
  return ++x;
}

이러면 howclosure() 를 부를 때마다 x를 1이 출력된다. 그런데 나는 저걸 부를 떄마다 1, 2, 3, 4 이렇게 증가했음 좋겠는 거다. 그럼 x를 빼보자.

let x = 0;
function howclosure(){
  return ++x;
}

이러면 확실히 원하는 결과값을 나올 건데 그러면 x는 전역 변수가 된다. 하지만 이러면 오염될 가능성이 많으니까 안 쓰는 게 좋은데.
내가 필요한 게 뭔가 > x 값을 유지하면서 밖에서 막 접근할 수 없게 하는 거.
이럴 때 쓰는 게 클로저 라고 한다.

함수는 태어난 환경을 기억한다.

function one(){
  let number = 0;
  function two(){ // two 함수는 본인이 태어난 환경인 one() 함수와 그 안에 number 변수를 기억한다.
  }
  return two;
}

const result = one(); // two 함수가 튀어나간다.

two 함수가 튀어나가도 함수는 본인이 태어난 환경을 기억하기 때문에 one(), number를 기억한다. 유지된다.

가비지컬렉터 : 변수의 참조가 멈추면 데려간다. -> 못 데려가게 계속 참조한다. : 클로저

근데!! 사실 목적은 one() 에 있는 걸 접근하는 거라서 우리가 접근할 때 쓰는 함수가 뭔지는 상관이 없다. two()라는 함수의 이름도 뭐든 상관이 없다. => 함수를 리턴해버리면 된다.

function one(){
	let number = 0;
  	return function(){}
}

const result = one()

----------
const counter = () => { let count = 0; return ()=> ++count}

return 으로 원래 있던 환경의 실행 컨텍스트가 끝나더라도 거기서 받은 변수, 상태를 기억하고 계속 참조하고 있어서 그 변수, 상태가 가비지 컬렉터에 들어가지 않도록 하는 것.
함수가 생성될 때의 스코프(환경)을 기억한다.

profile
'한 번 더!'의 가능성을 믿어! 오늘도 열심히 굴러가 보는 프론트엔드 개발자 😎

0개의 댓글