Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

codingfarm

클로저 함수(Closure Function) 본문

web/JavaScript

클로저 함수(Closure Function)

scarecrow1992 2020. 10. 17. 15:24

1. 클로저란?

  • 함수 내부에 만든 지역변수가 사라지지 않고 계속해서 값을 유지하고 있는 상태.
1
2
3
4
5
6
7
8
9
10
11
12
13
function func(){
    var count = 1;
    //일반 지역변수의 경우 함수 호출이 완료되면 사라지지만.
    
    $("#btn").on("click",
        //클로저를 이용하면 함수호출 완료 후 사라지는
        //지역변수를 사라지지 않는 데이터 저장소로 만들 수 있다.
        function(){
            count++;
            alert("count = " + count);
        }
    };
}
cs

 

  • 기본 문법은 아래와 같다.
1
2
3
4
5
6
function 외부함수(){
    var 변수A;
    function 내부함수(){
        변수A 사용;
    }
}
cs
  • 엄밀히 말하면 클로저에는 정해진 문법이 없다.
  • 그래도 위처럼 내부함수가 외부함수의 변수를 사용하는 형태라 생각하면된다.
  • 여기서 내부함수를 클로저 함수라 한다.
  • 변수A는 외부함수() 호출이 끝나더라도 사사지지 않고 값을 유지하게된다.

 

2. 예제

  • 아래 코드 실행시 출력값을 예측하시오.
1
2
3
4
5
6
7
8
9
functon addCount(){
    var count = 0;
    cout++;
    return count;
}
 
document.write("1. count = " + addCount(), "<br>");
document.write("2. count = " + addCount(), "<br>");
document.write("3. count = " + addCount(), "<br>");
cs

출력

1. count = 1
2. count = 1
3. count = 1
  • 변수 count는 addCount()가 호출될때마다 초기화되므로 계속해서 1이 출력된다.

 

클로저를 사용한경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function createCounter(){
    var count = 0;
    function addCount(){
        count++;
        return count;
    }
    return addCount;
}
 
var counter = createCounter();
 
document.write("1. count = " + counter(), "<br>");
document.write("2. count = " + counter(), "<br>");
document.write("3. count = " + counter(), "<br>");
cs
1. count = 1
2. count = 2
3. count = 3

 

주의

  • 내부함수를 리턴하는 구조만이 클로저라 착각할 수도 있다.
  • 하지만 아래의 구조도 클로저구조다.
1
2
3
4
5
6
7
8
9
10
11
12
$("#btnStart").click(function(){
    start();
    document.write("시작합니다.");
});
 
function start(){
    var count = 0;
    setInterval(function(){
        count++;
        document.write(count);
    }, 1000);
}
cs
  • 버튼을 클릭하면 start()가 실행되면서 지역변수인 count변수ㅏ 만들어지고 setInterval()이 실행된후 함수가 종료된다.
  • 이때 지역변수 count도 사라져야하는데. setInterval의 익명함수에서 count를 사용하고 있으므로 값이 계속해서 증가하는것을 볼 수 있다.

 

3. 클로저를 사용하면 좋은 점

  • 연관 있는 변수와 기능(중첩함수)를 하나의 함수로 묶어 독립적으로 실행 시킬 수 있다.
  • 함수 내부에 데이터가 만들어 지므로 외붕서 수정할 수 없는 보호된 데이터를 만들 수 있다.

 

 

 

 

 

'web > JavaScript' 카테고리의 다른 글

탭 기능 만들기  (0) 2020.10.17
콜백 함수(Call Back)  (0) 2020.10.11
중첩 함수(Nested Function)  (2) 2020.10.11
함수 종류  (0) 2020.10.11
함수 정의 방법 4가지  (0) 2020.10.11
Comments