자바 스크립트에는 두 가지 (주로 사용되는) 타이머 함수 유형이 setTimeout
있으며 setInterval
( other )
이 두 가지 방법 모두 동일한 서명이 있습니다. 콜백 기능과 지연 시간을 매개 변수로 사용합니다.
setTimeout
지연 후 한 번만 실행 setInterval
모든 지연 밀리 초 후에는 콜백 함수를 계속 호출합니다.
이 두 가지 방법 모두 타이머가 만료되기 전에 지우는 데 사용할 수있는 정수 식별자를 반환합니다.
clearTimeout
그리고 clearInterval
이 두 방법은 상기 함수로부터 정수 리턴 식별자 걸릴 setTimeout
및setInterval
예:
setTimeout
alert("before setTimeout");
setTimeout(function(){
alert("I am setTimeout");
},1000); //delay is in milliseconds
alert("after setTimeout");
당신은 위의 코드를 실행하면 당신은 경고 것을 볼 수 before setTimeout
후 after setTimeout
마침내는 경고 I am setTimeout
1 초 (1000ms)으로 깜박임 후
예제에서 알 수있는 setTimeout(...)
것은 비동기입니다. 즉, 다음 명령문으로 가기 전에 타이머가 경과 할 때까지 기다리지 않습니다.alert("after setTimeout");
예:
setInterval
alert("before setInterval"); //called first
var tid = setInterval(function(){
//called 5 times each time after one second
//before getting cleared by below timeout.
alert("I am setInterval");
},1000); //delay is in milliseconds
alert("after setInterval"); //called second
setTimeout(function(){
clearInterval(tid); //clear above interval after 5 seconds
},5000);
당신은 위의 코드를 실행하면 당신은 경고 것을 볼 수 before setInterval
후 after setInterval
마침내는 경고 I am setInterval
에서는 setTimeout 5 초 또는 다른 두 번째는 경고를 얻을 것이다마다 1 일 이후에 타이머를 클리어하기 때문에 1 초 (1000ms)으로 깜박임 후 5 번I am setInterval
무한합니다.
브라우저는 내부적으로 어떻게 작동합니까?
간단히 설명하겠습니다.
Javascript의 이벤트 큐에 대해 알아야한다는 것을 이해하려면. 브라우저에 구현 된 이벤트 큐가 있습니다. 이벤트가 js에서 트리거 될 때마다 이러한 모든 이벤트 (예 : click 등)가이 큐에 추가됩니다. 브라우저가 실행할 것이 없으면 대기열에서 이벤트를 가져 와서 하나씩 실행합니다.
이제 전화를 걸 setTimeout
거나setInterval
콜백이 브라우저의 타이머에 등록되고 주어진 시간이 만료 된 후 이벤트 대기열에 추가되고 결국 javascript는 대기열에서 이벤트를 가져 와서 실행합니다.
이것은 자바 스크립트 엔진이 단일 스레드이기 때문에 한 번에 하나만 실행할 수 있기 때문에 발생합니다. 따라서 다른 자바 스크립트를 실행하고 타이머를 추적 할 수 없습니다. 그렇기 때문에 이러한 타이머가 브라우저에 등록되어 있고 (브라우저는 단일 스레드가 아님) 타이머가 만료 된 후에 타이머를 추적하고 큐에 이벤트를 추가 할 수 있습니다.
같은 위해 발생 setInterval
이 삭제됩니다 또는 브라우저 페이지를 새로 고침 할 때까지 이벤트가 지정된 시간 후에 또 다시 큐에 추가됩니다이 경우에만.
노트
이 함수에 전달하는 지연 매개 변수는 콜백을 실행하는 최소 지연 시간입니다. 타이머가 만료 된 후 브라우저가 자바 스크립트 엔진이 실행할 큐에 이벤트를 추가하지만 콜백 실행은 큐의 이벤트 위치에 따라 다르며 엔진이 단일 스레드이므로 모든 이벤트를 실행하기 때문입니다. 대기열을 하나씩.
따라서 다른 코드가 스레드를 차단하고 대기열에있는 것을 처리 할 시간을주지 않으면 특별히 호출하는 데 콜백이 지정된 지연 시간보다 오래 걸릴 수 있습니다.
그리고 내가 언급했듯이 자바 스크립트는 단일 스레드입니다. 따라서 스레드를 오랫동안 막 으면
이 코드처럼
while(true) { //infinite loop
}
사용자에게 페이지가 응답하지 않는다는 메시지가 표시 될 수 있습니다 .
setTimeout(function(){/*YourCode*/},1000);