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 값을 인자로 넘겨주고
내부함수는 그 인자의 값을 사용해야 원하는 결과가 나온다.