본문 바로가기

카테고리 없음

클로저 의 응용

 

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

우리가 기대했던 함수가 함수 외부의 컨텍스트에 접근할 수 있을 것으로 기대하겠지만 위의 결과는 아래와 같습니다. 

5가 다섯번 나옵니다.

 

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

 for문이 돌때마다 arr[i] 함수가 실행이 되면 
function(id) 에 id라는 매개변수값으로 i의값을 받아서
함수내부로 전달하고 있습니다. 전달을 받아서 바로 리턴을 해줍니다.

내부함수를 리턴 하고있는데 외부함수에 지역변수인 id를 리턴해 주고 있습니다.

 

결과는 01234 가 나옵니다. 그이유는 내부함수의 지역변수가 외부함수의 지역변수에 접근할수 있었고

그함수가 만들어지는 시점에 i값을 외부함수가 id라고 하는 지역변수로 가지고 있어서 그외부함수에 내부함수를 호출하게 되면 그지역변수인 id값을 리턴해주고 있습니다.