Technique/Javascript

클로져 기초

kaelina 2016. 6. 20. 18:31
반응형

javascript에서 함수는 전부 클로져 입니다.
그럼 애초에 클로져는 무엇일까요

클로져( Clouser )
클로져는 간단히 정의 하자면 [ 자신을 포함한 스코프에 있는 변수를 참조가능한 함수 ] 라고 말할 수 있습니다.

말로는 느낌이 확 오지 않을수 있지만, 코드를 하나씩 읽어 내려 간다면 입문으로서 클로져는 간단히 이해 가능합니다.

스코프( Scope )
우선 javascript는 함수별로 스코프가 만들어 집니다.
스코프라는 것은 변수를 참조가능한 범위 입니다.
그 범위외에는 변수는 참조가 불가능합니다.


1
2
3
4
5
6
function func() {
  var value = 1;
  console.log(value);
}
func(); // 1
console.log(value); // undefined
cs


클로져의 예
여기서 크롤져의 예를 한번 볼까요


1
2
3
4
5
6
7
8
9
function func() {
  var value = 1;
 
  function innerFunc() {
    console.log(value);
  }
  innerFunc();
}
func(); // 1
cs


방금전 클로져에 대한 정의를 떠올려 봅시다
[ 자신을 포함한 스코프에 잇는 변수를 참조 가능한 함수 ]

안쪽의 함수가 바깥쪽의 함수의 변수를 참조 가능하게 되어 있습니다.
여기서 중요한 것은 값을 복사하는 겂이 아니라, 참조가 가능하다는 것 입니다.

그렇기 때문에 여기서는 아래와 같은 value의 변경이 가능합니다.


1
2
3
4
5
6
7
8
9
10
function func() {
  var value = 1;
 
  function innerFunc() {
    value++;
  }
  innerFunc();
  console.log(value); // 2
}
func();
cs



클로져의 실천예
여기서 기본적인 클로져의 실천예를 하나 들어 볼까합니다.
[ 모듈 패턴 ]을 소개합니다.

클로져의 이점중 하나가 변수를 private적인 변수로서 취급하는 것이 가능하다는 것입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var module = (function() {
  var count = 0;
 
  return {
    increment: function() {
      count++;
    },
    show: function() {
      console.log(count);
    }
  };
 
})();
 
module.show(); // 0
 
module.increment();
module.show(); // 1
 
console.log(count); // undefined
cs


임시함수를 사용하여 오브젝트를 생성합니다.
module에는 return 되고있는 오브젝트가 대입됩니다.

여기서 중요한것은, 임시함수내의 count에 관해서는 내부로부터만 참조된다는것 입니다.
외부로부터 접근 하려 하는 경우 당연히 [undefined]가 됩니다.

이것에 의해 private한 변수로서 사용하는것이 가능하게 됩니다.

반응형