2011-03-29 4 views
1

작은 div주기를 페이드 인 및 페이드 아웃 효과로 지정하라는 메시지가 표시되었습니다. 이 작업을 수행하는 데는 여러 가지 방법이 있지만 다음 이유가 한 번만 실행되는 이유가 궁금합니다.setTimeout이 재귀 적으로 익명 함수를 호출하지 않음

$(document).ready(function() { 
    (function(){ 
     setTimeout(function(){$("#foo").fadeOut().delay(800).fadeIn(800);},0) 
    })(); 
}); 

내가 알 수있는 한,이 함수는 재귀 적으로 실행되어야하지만 그렇지 않습니다.

나는 작업을 완료했기 때문에 setInterval(function(){$("#foo").fadeOut().delay(800).fadeIn(800);}, 0);으로 갔지만 여전히 예상대로 setTimeout이 작동하지 않는 이유를 알고 싶습니다.

+2

왜 재귀 적으로 실행될 것이라고 생각하십니까? – Shad

답변

6

에 대한 setInterval을 사용하지 마십시오.

지연 시간이 0으로 설정된 setInterval을 호출 중입니다. 즉, 애니메이션이 완료 될 때까지 계속 실행됩니다. 이렇게하면 jQuery의 내부 대기열에 애니메이션 효과를 계속 추가하여 시간이 지남에 따라 메모리 사용량을 늘릴 수 있습니다.

지연 시간을 애니메이션의 길이와 같거나 길게 늘릴 수는 있지만 신뢰할 만합니다. 타이머 (및 애니메이션)는 다른 코드에 의해 지연 될 수 있으며 이러한 종류의 하드 코딩은 피해야합니다. 여기

function fadeInOut() { 
    $("#foo").fadeOut().delay(800).fadeIn(800, fadeInOut); 
} 
fadeInOut(); 

을 당신은 jQuery를이 fadeIn 애니메이션을 종료 할 때 자동으로 호출되는 콜백으로 fadeInOut 기능을 전달하는 :

대신이 방법을. 이렇게하면 이전주기가 완료 될 때까지 새로운 애니메이션주기가 시작되지 않습니다.

+0

저는 한 줄로 그 일을하고 싶었습니다.하지만 이것은 분명 더 책임있는 접근 방법입니다. 팁 고마워. –

+0

이것은 내 것보다 더 우아합니다. – RSG

4

setTimeout(fx,delay)은 지연이 경과 할 때 한 번 호출됩니다. 이 경우 지연 0으로 호출하면 타임 아웃없이 코드를 한 번 호출하는 것과 동일합니다.

setInterval(function(){ 
    $('#foo').toggleFade(800); 
}, 800); 
다음

My favorite timeout vs interval posting

+0

@Shrinath 사람들이 언제 콜백 함수를 인용하지 않을 것입니까? – alex

+3

setInterval을 사용하여 호출 스택을 막을 수 있습니다. 함수 실행에 800 밀리 초보다 오래 걸리면 어떻게 될까요? setTimeout 함수를 다시 호출하면 IMO가 더 좋습니다. –

+0

@alex 사람들이 w3schools에 대한 언급을 중단하면. http://w3fools.com –

0

가 있습니다 :

setInterval 귀하의 경우 모든 시간에서 간격이 경과 할 때마다 호출되는 간격이 0이기 때문에 당신이 더 뭔가를 원한다고 생각 이 두 가지의 정의

setTimeout - setTimeout 함수는 지정된 시간 동안 지연 한 다음
은 지정된 함수의 실행을 트리거합니다. 함수가 트리거되면 setTimeout
이 완료되었습니다. 물론 clearTimeout 함수를 사용하여
함수를 트리거하기 전에 setTimeout의 실행을 종료 할 수 있습니다.

하여 setInterval -하여 setInterval 함수는 특정 기능의 실행을 트리거링
전에 소정의 시간 동안 지연시킨다. 그것이 다르다면
명령이 완료되지 않은 후에 명령이 완료되지 않는다는 것입니다. 대신 다시
지정된 시간 동안 대기 한 후 다시 기능을 트리거하고

웹 페이지 하나가 언로드 또는 사항 clearInterval 함수가 호출 될 때까지 지정된 간격으로 기능을 트리거의이 과정을 반복하고 있습니다.

1

setTimeout 메서드는 일정 시간이 지나면 무언가를 수행하지만 setInterval 메서드는 간격에 따라 X 초 후에 반복적으로 작업을 수행합니다.

그래서 반복적으로 뭔가를하도록 setTimeout을 얻으려면 루프 내에서 setTimeout을 래핑해야합니다.

하지만 당신이 무엇을 기반으로하는지 - setInterval 메서드가 더 좋습니다.

체크 아웃 :

http://www.w3schools.com/jsref/met_win_settimeout.asp

http://www.w3schools.com/jsref/met_win_setinterval.asp

0

에서는 setTimeout (FUNC, 밀리 세컨드)는 "밀리이 경과 한 후, 내가 FUNC를 호출합니다"말한다. 귀하의 기능은

function(){ 
    $("#foo").fadeOut().delay(800).fadeIn(800); 
} 

이므로 0 밀리 초가 지나면 함수가 호출됩니다. 그러나 setTimeout을 다시 호출하도록 지시하는 함수는 없습니다. 이 같은

뭔가 작동합니다

function my_func() { 
    // do something 
    setTimeout(my_func, 1000); 
} 

my_func(); 
관련 문제