본문 바로가기
시작/TIL(Today I Learned)

221110 JavaScript - setTimeout과 setInterval, 동기와 비동기, 싱글스레드,이벤트 루프(event loop)

by 백씨네 2022. 11. 11.

오늘 내가 배운 것

1. setTimeout, setInterval

2. 싱글 스레드

3. 동기와 비동기

4. 이벤트 루프(event loof)

 

 

1. setTimeout, setInterval

 

window.setTimeout 
window.setInterval  // window는 생략 가능하다.

일정 시간이 지난 후에 원하는 함수를 예약 실행(호출) 할 수 있게 하는 것을 '호출 스케줄링)이라고 한다.
이 두 개의 메서드는 자바스크립트의 스펙이 아니지만 시중에 나와있는 대부분의 호스트 환경에서 유사한 메서드, 내부 스케줄러를 지원한다.

 

기본 문법

window.setTimeout(callback, 시간)    
//callback : function ->실행할 함수
//시간 : number -> 시간  // ms 단위로 

window.setInterval(callback, 시간)
//callback : function ->실행할 함수
//시간 : number -> 시간

setTimeout : 2번째 인자 값인 number 즉, 밀리세컨드 가 충족되었을 때 딱 한 번만 실행한다.

 

setInterval : 2번 째 인자 값인 number 즉, 밀리세컨드 가 충족되었을 때 설정 시간마다 계속 실행한다.
인터벌을 종료하고 싶으면 인터벌을 변수로 선언해 놓고 `clearInterval(변수명)` 을 사용하면 된다. if문과 함께 사용하면 조건에 따른 종료도 가능하다.

 

 

2. 싱글 스레드

 

프로그램을 해석하는 사람이 한명이다. => 콜스텍이 하나이다.
자바스크립트는 콜스텍이 한 개인 언어여서 싱글 스레드 언어라고 말하기도 한다.
싱글 스레드의 단점을 해결하기 위해 코드를 해석할 수 있는 공간을 브라우저에서 `백그라운드` 를 만들었다.
그래서 스레드(콜스텍)은 한 개이지만 스레드 역할을 하는 곳이 2개이다.
하지만, 백그라운드에서 작동되는 순간 개발자가 직접 컨트롤 할 수 없고, 컨트롤 할 수 있는 것은 콜스택 하나이기 때문에 싱글 스레드라고 하지만 멀티스레드처럼 작동한다.

 

 

3.  동기와 비동기

 

자바스크립트는 동기 방식, 백그라운드는 비동기 방식이다. 동기 방식인 콜스택은 한 번에 한 가지 코드만 처리할 수 있고, 비동기 방식인 백그라운드는 여러 가지 일을 동시에 처리할 수 있다. 비동기 방식을 동기적으로 코드를 구현해서 어느 정도 원하는 순서대로 출력을 할 수 있으면 프로그램을 잘 만들 수 있다.

 

console.log(1)
setTimeout(function (){
    console.log(2)
}, 0)
console.log(3)     //1 ,3, 2  콜스택이 실행이 다 되고 백그라운드가 실행되기 때문에..
                   //콜스텍을 처리가 제일 우선적..

 

어떤 순서로 실행이 되는지 알면 원하는 대로 짤 수 있다.

콜백 지옥 (callback hell) :  비동기 방식으로 프로그래밍을 할 때 발생하는 문제.. 

함수의 매개변수로 다른 함수가 들어가고 그 함수 안에 매개변수로 또 다른 함수가 들어가서 코드의 들여 쓰기가 심하게 깊어지는 현상을 말한다.

 

4.  이벤트 루프( Event loof)


코드가 실행이 될 때 브라우저에서 만든 함수를 백그라운드로 넣고 설정 시간이 지난 후 실행을 하면서 테스크 큐에 넣어둔다. 테스크 큐는 선입선출, 즉, 먼저 실행된 코드가 먼저 실행이 된다. 테스크 큐는 콜스택을 보고 있다가 콜스택의 함수들의 실행이 끝난 후 테스크 큐에서 대기하고 있던 코드들이 콜스택으로 들어갔다 나오면서 코드가 실행이 된다.

 

이벤트 루프의 구조

 


 

 


더보기
HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="./public/css/index.css" type="text/css" rel="stylesheet">
</head>
<body>
    <ul id="visual">
        <li class="a on">1</li>
        <li class="b">2</li>
        <li class="c">3</li>
        <li class="d">4</li>
        <li class="e">5</li>
    </ul>    
    <script src="./public/js/index2.js" type="text/javascript"></script>
</body>
</html>
CSS
const a = document.querySelector('.a')
const b = document.querySelector('.b')
const c = document.querySelector('.c')
const d = document.querySelector('.d')
const e = document.querySelector('.e')

const element = document.querySelectorAll("#visual > li")
// [element, element, element, element, element ]




let count = 1
const intevalId = setInterval(function(){
    for(let i = 0 ; i < element.length; i++){
        if(i == count){
            element[i].classList.add("on")
        }else{
            element[i].classList.remove('on')
        }
    }
    if(++count == 5) count = 0
}, 3000)




            // let count = 1
            // setInterval(function(){
            //     if(count === 0){
            //         //className 을 안쓰는 이유
            //         a.classList.add('on')
            //         b.classList.remove('on')
            //         c.classList.remove('on')
            //         d.classList.remove('on')
            //         e.classList.remove('on')
            //     }else if(count === 1){
            //         a.classList.remove('on')
            //         b.classList.add("on")
            //         c.classList.remove('on')
            //         d.classList.remove('on')
            //         e.classList.remove('on')
            //     }else if(count === 2){
            //         a.classList.remove('on')
            //         b.classList.remove('on')
            //         c.classList.add("on")
            //         d.classList.remove('on')
            //         e.classList.remove('on')
            //     }else if(count === 3){
            //         a.classList.remove('on')
            //         b.classList.remove('on')
            //         c.classList.remove('on')
            //         d.classList.add("on")
            //         e.classList.remove('on')
            //     }else if(count === 4){
            //         a.classList.remove('on')
            //         b.classList.remove('on')
            //         c.classList.remove('on')
            //         d.classList.remove('on')
            //         e.classList.add("on")
            //     }              
                
            //     if(++count == 5 ) count = 0
            // }, 3000)

 

 

댓글