안녕세계

[JavaScript] Closure Concept (클로저 개념) 본문

[JavaScript] Closure Concept (클로저 개념)

Junhong Kim 2017. 4. 2. 17:54
728x90
반응형

클로저(Closure) ?

- 다른 함수안에 정의된 함수를 클로저라고 한다. (즉, 특정 함수 안에 함수가 정의된 것)

- 클로저는 내부함수가 외부함수의 맥락에 접근할 수 있는것을 말한다.

 

내부함수(inner function) 

- 함수 안에 함수가 선언되어 있는 것

 

외부함수(outter function)

- 내부 함수 바깥에 선언된 함수

 

특징

(1) 내부 함수에서 외부함수의 지역변수에 접근할 수 있다.

(2) 외부함수가 소멸 되어도 내부함수는 외부함수의 지역변수에 접근할 수 있다

(3) 클로저 기법을 사용하여 Private 변수를 구현할 수 있다.

 

[예시1] 내부함수 특징 : 내부함수 에서 외부 함수의 지역변수에 접근할 수 있다.

function outterFunction() {
   var text = 'Hello JavaScript';
   function innerFunction() {
       console.log(text);
   }
   innerFunction();
}

outterFunction();

// Hello JavaScript

 

위 결과를 보면 innerFunction()에서 outterFunction()에서 정의된 text 변수를 innerFunction()에서 접근할 수 있는것을 볼 수 있다. 

 

[예시2] 클로저 특징 : 외부함수가 소멸 되어도 내부함수는 외부함수의 지역변수에 접근할 수 있다

function outterFunction() {
   var text = 'Hello JavaScript';
   return function() {
       console.log(text);
   }
}

var innerFunction = outterFunction();
innerFunction();

// Hello JavaScript

 

위 결과를 보면 outterFunction()에서 return 후 소멸 되었음에도 새로 할당된 innerFunction()에는 text 변수의 값이 복사 되어 출력이 되었다.

 

[예시3] 클로저 특징 : 클로저 기법을 사용하여 Private 변수를 구현할 수 있다.

내부함수는 외부함수의 지역변수에 접근할 수 있으므로 setter와 getter를 구현하여 Private 변수를 구현할 수 있다..

(예시 추후 추가)

 

[예시4] 클로저 응용

var arr = [];
for (var i = 0; i < 5; i++) {
   arr[i] = function() {
       return i;
   }
}

for(var index in arr) {
   console.log(arr[index]());
}

// 5
// 5
// 5
// 5
// 5

 

위 코드를 보면 0~4의 값이 출력될 것이라고 예상을 하게 되는데 결과 값은 5가 5번 출력된다. i는 전역변수(자바스크립트는 블록스코프가 없다) 5가된 상태에서 마지막 for in 루프가 돈다. 그 이유는 arr[index]() 즉 arr[i]의 값에 function() {} 자체가 들어가게 되고 for 문이 모두 순환된 이후 마지막 값인 5가 출력되 기 때문이다.

 

arr[0] = function() {}; / arr[1] = function() {}; / ... / arr[4] = function() {};

(arr[i]에는 i 값이 들어가는 것이 아니라 function() {} 자체가 할당 된다는 것을 유의)

var arr = [];
for(var i = 0; i < 5; i++) {
    arr[i] = (function(id) {
        return function() {
            return id;
        }
    })(i);
}

for (var index in arr) {
    console.log(arr[index]());
}

// 0
// 1
// 2
// 3
// 4

 

문제점을 해결한 코드. 위에서 arr[i]의 값에 숫자값이 아니라 함수가 들어간다는 것을 알았다. 마지막 console.log에서 arr[index]가 아니라 arr[index]() 임을 유의하자. 이 뜻은 arr[index]의 함수 즉 arr[1](1)을 호출, 하면 function(id) 에 function(1) 이 들어가고 여기에서 내부 함수는 외부함수의 id 변수를 id 값을 반환한다. 그래서 수정한 코드에서 i를 id 파라미터로 값을 유지시켜서 원하는 값이 출력되는 것.

 

(+) 마지막 예시가 이해가 안되시나요? ㅠㅡㅠ .. 그럼 즉시 실행 함수에 대한 이해를 해보고 다시 봐보세요!!

var func = function() {
    
};

func();

위 코드는 func() 함수를 정의하고 바로 다음 코드에서 실행하는 코드이다.

(function() {

})();

코드를 줄이기 위해서 위와 같은 방법으로 코드를 작성할 수 있음

변수에 할당하여 즉시 실행 할 경우는 함수를 ( ) 묶지 않아도 되지만, 가독성을 위해 되도록 즉시 실행 함수는 괄호를 써주자

function() {

}();

위 코드는 Error!! 라는 점을 참고

728x90
반응형

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

[JavaScript] Date format  (0) 2017.04.12
[JavaScript] Inheritance Mechanism (상속 메커니즘)  (0) 2016.07.18
Comments