>웹 프론트엔드 >JS 튜토리얼 >JavaScript `for` 루프에 중첩된 `setTimeout`이 비연속적인 값을 인쇄하는 이유는 무엇입니까?

JavaScript `for` 루프에 중첩된 `setTimeout`이 비연속적인 값을 인쇄하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-15 15:32:14858검색

Why Does Nested `setTimeout` in a JavaScript `for` Loop Print Non-Consecutive Values?

문제 이해: for 루프에 중첩된 setTimeout의 비연속 값 인쇄

JavaScript에서 setTimeout과 같은 비동기 함수는 콜백을 예약합니다. 지연 후 실행합니다. 루프 내에 배치하면 콜백에서 액세스하는 변수가 루프 상태와 동기화되지 않는 예기치 않은 동작이 발생할 수 있습니다.

예: 잘못된 값 경고

제공된 스크립트를 고려하세요.

for (var i = 1; i <= 2; i++) {
    setTimeout(function() { alert(i) }, 100);
}

이 코드는 값 1과 2를 경고하기 위한 것입니다. 연속적으로 3을 두 번 출력합니다. 그 이유는 i의 현재 값을 참조하는 콜백을 생성하는 setTimeout의 비동기적 특성에 있습니다.

함수 문자열 없이 i 전달

이 문제를 해결하려면 연속적인 값 인쇄를 보장하려면 각 setTimeout 콜백에 대해 고유한 i 인스턴스를 생성해야 합니다. 해결 방법은 다음과 같습니다.

function doSetTimeout(i) {
  setTimeout(function() {
    alert(i);
  }, 100);
}

for (var i = 1; i <= 2; ++i)
  doSetTimeout(i);

각 콜백에 대한 명시적 함수를 생성하고 i를 인수로 전달하여 루프 반복마다 별도의 i 복사본을 생성합니다. 이를 통해 콜백은 실행 시 올바른 i 값을 참조하여 1과 2의 연속 인쇄를 보장합니다.

위 내용은 JavaScript `for` 루프에 중첩된 `setTimeout`이 비연속적인 값을 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.