WEB/Javascript

클로저

먕고 2014. 8. 8. 10:51

클로저(closure)

내부함수가 외부함수의 맥락에 접근할 수 있는 것


어떤 함수 안에서만 사용되는 함수를 inner함수로 정의

외부에 정의한다면 응집성이 떨어지고 다른 곳에서도 호출 가능하기에 문제점이 발생

외부함수 바깥에서는 외부함수의 변수를 접근을 막고  내부함수는 외부함수의 지역번수를 참조할 수 있다. 


클로져는 private 변수를 생성할 수 있다. (외부에서 함부로 변경할수 없도록)

인자로 받은 변수는 내부함수에서만 쓰이고 직접 변경 할수 없다. (내부 함수를 통해서만 접근 가능)


private변수가 필요한 이유

소프트웨어가 커지며 많은 사람이 코드에 접근하게 된다. 

누구나 변수를 접근하여 변경할 수 있게 된다. 소프트웨어가 망가질 확율이 크다.


클로저 구현시 실수하기 쉬운 상황

var arr = []
for(var i = 0; i < 5; i++){
arr[i] = function(){
return i;
}
}
for(var index in arr) {
console.log(arr[index]());
}

i가  function이 만들어졌을때의 값인 0,1,2, ... 이렇게 들어갈꺼라 생각되지만.

생성한 function () {} 은 외부의 i를 참조할 뿐이다. 


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]());
}

전역 변수인 i를 직접 쓰는 것이 아니라 외부 함수를 만들어 바로 호출을 하여 그때의 i 값을 인자로 넘겨주고 

내부함수는 그 인자의 값을 사용해야 원하는 결과가 나온다.