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