마소의 시험문제 였던 클로저

javascript 2015. 4. 5. 11:43

728x90
반응형

예전에 어떤 블로그에서 마소의 입사 면접에서 '클로저' 라는걸 물어봤었다고 본 기억이 있다.

난 아직은 이걸 어디에 어떻게 쓰일지 잘 모르기에 넘기려 했으나...

마소의 면접에서 이걸 물어볼 정도면 알아둬서 나쁠게 없다고 생각이 들어서 포스팅 하려 한다.


클로저를 알기전에 예제 하나를 보자.


코드-1

1
2
3
4
5
6
7
// 함수를 선언합니다.
function test(name){
    var output = 'Hello ' + name + '..!';
}
 
// 출력합니다.
alert(output);
cs


이 코드를 보면..

alert 로 output 을 호출하려 한다.

하지만 output 는 함수 내부에 있는 '지역변수' 이므로 외부에서 사용이 불가능 하다.

지역변수는 함수가 실행될 때 생성되고 함수가 종료될 때 사라진다.


하지만 클로저를 사용하면 이 규칙을 위반할 수 있다.


예제 하나를 살펴보자


코드-2

1
2
3
4
5
6
7
8
function outerFunction(name){
    var output = 'Hello ' + name + '..!';
    return function(){
        alert(output);
    };
}
 
outerFunction('RintIanTta')();
cs


()() 를 두번 쓰는 이유는 아래 스샷을 참고하자




뭔가 이상해 보일 수 있는데 선언적 함수를 호출시키면 그 함수 내부에 있는 내용 그 자체를 리턴하게 된다. 그래서 리턴되는 선언적 함수 내부의 익명함수를 호출 시킬때는 () 를 한번 더 써줘야 익명함수를 호출 할 수 있게 된다.


여튼 위의 코드-2 에서

자바스크립트 스스로 아직 지역 변수 output을 지우면 안된다는걸 인식하고 남겨두므로 발생하는 특성이다.

클로저는 워낙 다양하다고 한다. 이처럼

지역변수를 남겨두는 현상 이나 함수 outerFunction() 내부의 변수들이 살아있는 것이므로 함수 outerFunction()으로 인해 생성된공간 또는 리턴되는 함수 자체를 클로저 라고 부르기도 하며, 살아남은 지역 변수 output을 클로저라고 부르기도 한다.


/* 추가로 지역 변수 output 을 남겨둔다고 외부에서 마음대로 사용할 수 있는 것은 아니다, 반드시 리턴된 함수를 사용해서만 지역변수 output을 사용할 수 있다. 클로저 함수로 인해 남는 지역 변수는 각각의 클로저의 고유한 변수.. */

반응형

'javascript' 카테고리의 다른 글

[내장 함수]eval  (0) 2015.04.05
[내장 함수]인코딩과 디코딩  (0) 2015.04.05
비유효 매개변수  (0) 2015.03.24
익명함수와 선언적함수의 차이  (0) 2015.03.24
중첩 반복문2(피라미드 만들기)  (2) 2015.03.23