2012-05-16 3 views
1
var linksList = [ 
    "http://a.com", 
    "http://b.com", 
    "http://c.com", 
] 

for (var i=0; i<linksList.length; i++) { 
    setTimeout(function() { 
     console.log(linksList[i]); 
    }, 3000); 
} 

크롬 검사기에 붙여 넣는 이유는 무엇입니까? (완전히 임의의 숫자 인 것 같습니다.) ... 다음 기다리면 3 '정의되지 않은'콘솔이 반환됩니다. 오류왜이 자바 스크립트는 정의되지 않은 값을 반환합니까?

답변

5

사용 폐쇄 :

for (var i=0; i<linksList.length; i++) { 
    (function(i){ 
     setTimeout(function() { 
      console.log(linksList[i]); 
     }, 3000); 
    })(i); 
} 

귀하의 문제는 당신이 출력되도록 setTimeout의 콜백은, 이미 i = linksList.length를 호출 할 때입니다 :

console.log(linksList[ linksList.length ]); 

3 번, 여기서 linksList[ linksList.length ]undefined입니다.

+0

중첩 된 함수 내에서 생성되지 않았기 때문에 사용할 수 있다고 생각 했습니까? 흠. 감사. 나는 더 많이 추측해야 할 것입니다 – Tallboy

+0

흠 ... 지금은 작동하지만 콘솔에 동시에 모든 것을 기록합니다. (최소한 현재에는 아무런 오류가 없습니다.) – Tallboy

+0

@Tallboy 모든'setTimeout' 함수는 다음과 같습니다. 대략 동일한 시간에 설정되고 동일한 지연 ('3000ms')으로 콜백이 대략 동시에 호출됩니다. 콜백 호출간에 지연을 원한다면'setTimeout' 함수에 다른 지연을 지정하십시오. 예를 들어,'setTimeout (function() {}, 3000 * (i + 1))'로 콜백은'3000ms' 지연으로 호출됩니다. – Engineer

관련 문제