2016-09-05 4 views
0

JavaScript 코드가 있습니다. 내가 a[2]()를 호출하면기능 범위 이해

var a = []; 

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

a[2](); 

나는 2있는 메시지를 볼 것으로 예상하지만,이 대신에 나는 5를 참조하십시오.

내가이처럼 다시 작성할 수 있습니다를 해결하려면 :

for (var i = 0; i < 5; i++) { 
    (function (v) { 
     a[i] = function() { 
      alert(v); 
     } 
    })(i) 
} 

그러나 나는 그것이 작동합니까 방법을 이해할 수 없습니다. 그렇다면 왜 함수 코드를 닫아야합니까?

+3

다른 언어에 반대, * JS에서 for' 문 '에서 암시 적 범위가 없습니다. * 익명 함수는, 다른 한편으로는, 자신의 범위가 및 외부 지역 주민을 캡처하기 때문에 따라서 함수 내부에 루프 몸체를 래핑하고 바로 호출하면 문제가 해결됩니다. –

+0

이 경우 * i *가 전역임을 유의하십시오. – RobG

+0

@RobG, 외부 범위로. 우리는 그것이 무엇인지 알지 못합니다. 그것은 글로벌 스코프 일 수도 있고 기능 또는 다른 폐쇄 일 수도 있습니다. –

답변

-1

클로저가있는 자체 호출 함수는 범위를 만드는 좋은 방법입니다.

var a = []; 
 

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

 
a[2]();