Karlie_dev
{SourceCode}
Karlie_dev
전체 방문자
오늘
어제
  • 분류 전체보기
    • 컴퓨터공학
    • JAVA
    • CSS
    • 자바스크립트
    • 파이썬
    • 스프링
    • DB
      • SQL
      • MySQL
      • Oracle
      • MongoDB
      • MariaDB
    • 형상관리
    • IDE
      • VS Code
      • Eclipse
    • 알고리즘
    • Server
    • AWS
    • 개발소리
    • Docker&Kubernetes
    • Cloud (클라우드)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • mariadb
  • JavaScript
  • MongoDB
  • 자바스크립트
  • 파이썬
  • 스프링부트
  • k8s
  • kubernetes
  • 도커
  • oracle
  • nodejs
  • docker
  • 쿠버네티스
  • MySQL
  • AWS
  • 스프링
  • Spring
  • Minikube
  • 마리아디비
  • 오라클

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Karlie_dev

{SourceCode}

자바스크립트

setTimeout 에 대하여

2020. 1. 4. 15:21

setTimeout에 대하여

함수의 두번째 파라미터로 타임을 지정하고, 그 시간이 경과될 경우 첫 번째 파라미터의 익명함수 혹은 함수 또는 코드를 실행하는 함수이다.

// 문법
setTimeout(func, time);
// 예시
setTimeout(showAlert, 100);

위와 같이 쓰이는데 이때 time은 ms(1000분의 1초) 단위로 0.5초는 500, 1초는 1000을 사용한다.
해당 함수의 리턴값은 setTimeout인 타이머의 id, 즉 고유값이 나오고 해당 id를 이용해 타이머를 종료해줄 때 사용할 수 있다. 이 때 종료는 clearInterval 도 가능하지만 가능하면 clearTimeout을 사용하도록 한다.

기능은?

기능은 정말 간단하게, 일정시간 이후에 함수를 실행시키는 것 뿐이다.

<button id="clickBtn">클릭</button>
<script>
    document.getElementById("clickBtn").addEventListener(function(){
        alert("사용자가 클릭");
        setTimeout(function(){
        	alert("3초 뒤 뜨는 것")
		}, 3000);
    });
</script>

혹은 더 간결하게 표현한다면

function showAlert(){
    alert('3초뒤 뜨는 것');
}
document.getElementById('clickBtn').addEventListener(function(){
    alert('사용자가 클릭');
    setTimeout(showAlert, 3000);
});
 

작동방식 혹은 유의점

만약 setTimeout을 반복적으로 호출하고 싶다면?

반복적 호출이라고 하면 보통 setInterval을 생각할 수 있다.

하지만 여기서 setInterval과 setTimout의 가장 큰 차이점에 의해 setTimeout이 조금 더 안정적이다.

setInterval 코드를 보자.

var i=1;
setInterval(function(){
    func(i);
}, 100);

setTimeout 코드는 아래와 같다.

var i=1;
setTimeout(function run(){
    func(i);
});

결과는 같겠지만, 결코 같지 않다.

setInterval을 사용하면 func 함수 호출 사이의 지연 간격이 지정한 100ms보다 더 짧아진다.

그 이유는 100ms 지연 간격에 func 코드를 실행하는 시간도 포함되기 때문에, 점점 타임이 뒤로 밀린다. 그렇게 계속 딜레이 되다가, func 함수를 실행하는 데 걸리는 시간이 100ms보다 길면, func 함수 실행이 종료될 때까지 기다리고 바로 다음 호출을 시작한다.
즉 함수 호출 간격인 100ms가 더 이상 의미가 없어지는 것이다.

그에 반해 setTimeout의 똑같은 100ms 딜레이에, func 함수 호출이 끝난 뒤에 100ms라는 간격을 체크하기 때문에 항상 간격이 일정하게 유지될 수 있다.

setTimeout에서 대기 시간, 즉 딜레이 시간을 0으로 설정한다면?

setTimeout(showAlert, 0);

이런 경우는 setTimeout 파라미터인 함수를 최대한 빨리 실행할 수 있다. 하지만 현재 실행중인 스크립트 처리가 종료된 이후 함수를 실행한다.

setTimeout(() => alert('world'));
alert('hello');

위와 같은 코드가 있다면 world가 먼저 뜨지 않고, 현재 실행중인 스크립트 처리가 종료된 이후 실행하므로 hello 가 먼저 뜨고 그 뒤에 world가 뜬다.
즉, 실행 순서가 [현재 실행중인 스크립트] > [setTimeout] 이다.


참고

  • https://developer.mozilla.org/ko/docs/Web/API/WindowTimers/setTimeout]
저작자표시 (새창열림)
    '자바스크립트' 카테고리의 다른 글
    • Node.js 에서 MySQL(async await) 연동
    • CREATE-REACT-APP 설치가 되지 않을 때 (혹은 프로젝트 폴더가 비었을 때)
    • 자바스크립트 다양한 input type 값 꺼내기
    • JavaScript unshift(), push(), shift(), pop() 정리
    Karlie_dev
    Karlie_dev

    티스토리툴바