[javascript] 클로저에 대한 정의

조회수 617회

안녕하세요. 자바스크립트로 클로저에 대해서 공부하고 있는데요.

  1. 자신이 정의된 환경 밖에서 실행되고
  2. 스코프 탐색이 현재 실행 스택이 아닌 외부를 참조할때 를 클로저라고 부른다고 이해하였습니다.

제가 참고하여 공부한 링크입니다 : https://meetup.toast.com/posts/86

function foo() {
    var color = 'blue';
    function bar() {
        console.log(color);
    }
    bar();
}
foo();

이 경우에 본문에서는 아래와 같이 말하고 있는데요.

bar는 foo안에서 정의되고 실행되었을 뿐, foo밖으로 나오지 않았기 때문에 클로저라고 부르지 않는다.

function count() {
    var i;
    for (i = 1; i < 10; i += 1) {
        setTimeout(function timer() {
            console.log(i);
        }, i*100);
    }
}
count();

timer는 클로저로 언제 어디서 어떻게 호출되던지 항상 상위 스코프인 count에게 i를 알려달라고 요청할 것이다.

본문에서는 위와 같이 timer 함수가 클로저라고 하였습니다. 이 코드의 경우 timer 함수가 내부함수이고 외부 스코프를 참조하는것은 알겠으나 , timer 역시 count함수 밖을 나오지 않았기에 클로저라고 부를 수 없는것 아닌가요?

제가 생각하기에는 .. count();가 실행되면서 setTimeout함수가 실행되면서 내부의 timer함수또한 실행되어서 외부에서 사용되었다(?) 라고 말할 수 있을것같은데.. 이경우에 foo();가 실행되면서 내부에서 bar()도 실행되지 않나..? 라는 생각이 들어 외부에서 실행되었다는것이 정확히 무엇을 말하는것인지 잘 이해가 가지 않는것같습니다.

혹시 처음 함수가 실행되는 것이 외부에서 실행되어야하는것인가요?

질문 읽어주셔서 감사합니다!

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 혹시 처음 함수가 실행되는 것이 외부에서 실행되어야하는것인가요? ← 네 그게 "자신이 정의된 환경 밖에서 실행"되어야한다는 의미일것 같아요. 엽토군 2019.2.11 15:29
  • setTimeout으로 실행되는 함수는 비동기 실행입니다. 이벤트 큐에 대기하고 있다가 메인 코드가 모두 종료되었을 경우(메인로직이 스택상에서 모두 사라진 뒤) 실행되므로 보이는 코드상으로는 count 안에서 선언되고 실행되는 것 처럼 보이지만 실제로는 외부에서 실행되는 것으로 봐야 합니다. doodoji 2019.2.11 17:12
  • 그건 그렇고 실제 콘솔에 출력되는 i값은 다 10으로 나올텐데 왜 저런 예제가 설명에 나온 걸까요. doodoji 2019.2.11 17:14
  • ㄴ "기대했던 대로는 돌지 않고 클로저를 써야 제대로 돌아가는" 예제로서 유명한 모양이더라고요. 엽토군 2019.2.11 17:16
  • ㄴㄴ 아 ㅋㅋㅋ 그렇군요. 역시 함정이었어... doodoji 2019.2.11 17:21
  • 답변해주셔서 감사합니다! setTimeout이 외부에서 실행되는것이었네요! 알 수 없는 사용자 2019.2.11 20:26

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)