Javascript 이벤트 순환이란?

Javascript는 단일 스레드입니다. 즉, 한 번에 하나의 조작만 실행합니다.한 번에 한 라인에서만 하나의 조작을 실행하는 과정은 바로 우리가 자바스크립트가 동기화되는 원인이라고 말하는 것이다.하지만 한 가지 임무를 완수하는 데 시간이 오래 걸리면 어떤 일이 일어날까?우리가 이 특정 임무가 완성되기를 기다릴 때, 모든 다른 임무는 멈출 수 있습니까?이것은 분명히 우리의 응용 프로그램을 늦출 것이다.이러한 영향을 피하기 위해 자바스크립트는 이벤트 순환을 바탕으로 하는 병행 모델을 가지고 이 모델은 여러 임무를 비동기적으로 처리하는 능력을 제공한다.
본고는 자바스크립트가 실행될 때의 환경, 이벤트 순환과 그 배후의 메커니즘을 이해함으로써 자바스크립트가 왜 단일 라인이지만 비동기적인지 이해하도록 도와준다.

Javascript 런타임


각 브라우저에는 Javascript 런타임 환경이 있습니다.
다음은 가시화 운행을 돕는 예이다.

따라서javascript가 실행될 때 포함

Javascript 엔진


모든 브라우저는 서로 다른 버전의javascript 엔진을 사용합니다.그중 일부는 V8(Chrome), Quantum(Firefox), 웹키트(Safari)가 유행한다.엔진 내부에 메모리 더미와 호출 더미가 있습니다.
메모리 더미
우리가 대상을 만들거나 함수를 설명하거나 변수를 분배할 때마다 메모리를 분배합니다.이 메모리는 더미에 저장된다.
스택 호출
javascript의 단일 루틴 특성은 호출 창고가 하나밖에 없기 때문입니다.호출 창고에서 자바스크립트 코드가 한 줄씩 읽히고 실행됩니다.호출 스택은 먼저 추가된 함수를 마지막으로 실행하는 고급 선출(FILO) 원칙을 따릅니다.함수가 실행되면 창고에서 팝업됩니다.우리들은 이 개념을 명확하게 하기 위해 몇 가지 코드를 보았다.
const getMovie = () =>{
 console.log ('Avengers')
}
getMovie()
// Avengers

다음은 JS 엔진이 이 코드들을 어떻게 처리하는지...
  • 우선, 이것은 코드를 해석하여 문법 오류를 검사하고, 문법 오류가 발견되면 코드를 계속 실행한다.
  • getMovie () 호출을 보고 창고로 옮깁니다.

  • getMovie() 호출 콘솔.log () 그리고 창고 꼭대기로 밀려...

  • JS 엔진은 이 함수를 실행하고 복수자를 컨트롤러로 되돌려줍니다.그리고 통나무를 창고에서 꺼내세요.

  • javascript 엔진은 getMovie () 함수로 돌아가서 오른쪽 괄호에 도달하고 창고에서 팝업합니다. (실행이 완료되었을 때)

    그림에서 보듯이 함수는 창고에 추가되어 실행되고 삭제됩니다.창고의 맨 위에 있는 함수는 초점 함수입니다. 창고를 되돌려주고 팝업할 때 JS 엔진은 다음 프레임으로만 이동합니다. (창고의 항목을 호출하는 것을 창고 프레임이라고 합니다.)호출 스택은 맨 위에 있는 프레임으로 돌아간 다음에 다음 프레임으로 돌아갑니다. 이것이 바로 우리가 JS 엔진이 동기화되어 실행된다고 말하는 이유입니다.
  • 현재 외부 파일에서 데이터를 얻고 싶거나, 되돌아오는 데 시간이 걸리는 API를 호출하고 싶다면, 응답을 기다리는 동안 이 프로그램을 계속 사용할 수 있도록 하려면 코드가 실행을 멈출 수 없다. 자바스크립트는 이를 실현할 수 있는 방법이 있다. 다음은 웹 API를 소개하는 부분이다.

    Web API


    웹 API는 브라우저에서 제공합니다. 브라우저의 자바스크립트가 실행될 때 환경에 있지만 자바스크립트 엔진에 없습니다.HTTP, AJAX, 지리적 위치, DOM 이벤트, setTimeout은 웹 API의 예이다.웹 API가 비동기 코드를 작성하는 데 어떻게 도움을 주는지 알아보기 위해 코드 예시를 사용합니다.
    console.log ('1') // outputs 1 in the console
    const getNumber = () =>{
    //in this setTimeout, we set the timer to 1s (1000ms = 1s)
    //and pass a callback that returns after 1s
    setTimeout((cb)=>{
    console.log('2')
    }, 1000)
    }
    getNumber()
    console.log('3')
    //1
    //3
    //2
    
    자바스크립트가 이 코드와 출력을 어떻게 실행하는지 평가해 봅시다
  • 여느 때와 마찬가지로, 우선, 문법 오류를 찾기 위해 코드를 해석하고, 없으면 코드를 계속 실행합니다.
  • 첫 번째 콘솔.log가 창고로 전송되고 1이 되돌아와 창고에서 팝업됩니다.
  • 다음 함수 getNumber () 가 창고로 전송됨
  • getNumber()가 setTimeout을 호출했습니다. 이것은 웹 API의 일부분입니다. 기억하십니까?
  • setTimeout이 창고에 호출되었을 때 타이머가 있는 리셋은 해당하는 웹 API에 추가되며 카운트다운이 시작됩니다.setTimeout이 스택에서 팝업됩니다.
  • getNumber()가 완료되어 스택에서 제거되었습니다.
  • 마지막 콘솔log가 창고에 추가되어 컨트롤러에 3로 되돌아와 창고에서 삭제됩니다.

    그럼 1초 후 타이머 카운트다운이 끝나면 무슨 일이 일어날까요?웹 API에서 리셋을 팝업하는 창고라고 생각할 수도 있지만, 이렇게 하면 리셋은 실행 중인 다른 코드 사이에 무작위로 나타납니다. 이러한 상황을 방지하기 위해 웹 API는 리셋을 메시지 대기열에 추가합니다.
  • 메시지 대기열은 기본적으로 자바스크립트가 실행될 때 처리해야 할 메시지를 표시하는 데이터 구조입니다.호출 창고와 달리 메시지 대기열은 선진 선출 (FIFO) 원칙을 사용하고 대기열에 추가된 첫 번째 함수를 먼저 처리합니다.

    현재 자바스크립트가 실행될 때 창고가 비어 있다는 것을 어떻게 알 수 있습니까?또는, 이벤트는 어떻게 메시지 대기열에서 호출 창고로 전송됩니까?사건 순환에 들어가다.
    이벤트 순환 작업은 호출 창고와 메시지 대기열을 지속적으로 감시하는 것입니다.호출 창고가 비어 있으면, 메시지 대기열의 첫 번째 이벤트를 받아들여 호출 창고로 전송합니다.호출 창고와 메시지 대기열은 한동안 비어 있을 수 있지만, 이벤트 순환은 검사를 멈추지 않습니다.
    우리 코드로 돌아가면, 이벤트가 반복적으로 호출된 창고가 비어 있는지 확인하고, 호출된 창고가 비어 있는지 확인합니다. 따라서 컴파일 (cb) 을 창고로 전송하고, 창고에서 컨트롤러로 2를 되돌려 창고에서 삭제합니다.우리의 코드가 실행되었다.
    그 밖에
    0밀리초를 초과하여 시간 초과를 설정하면 어떤 일이 일어날까요?
    const getCurrency = ()=>{
     setTimeout(()=>{
     console.log('dollar')
    }, 0)
    }
    getCurrency()
    const name = () =>{
    console.log('Frank')
    }
    name()
    // Frank
    // dollar
    
    위 코드를 복사하고 콘솔에서 보면 Frank를 인쇄한 다음 dollar를 인쇄하는 것을 알 수 있습니다.다음은 JS가 이러한 코드를 처리하는 방법입니다.
  • 우선, 계속 실행하기 전에 코드를 해석하고 문법 오류를 찾습니다.
  • getCurrency()가 스택으로 밀어넣습니다.
  • getcurrency () 는 setTimeout을 호출합니다. JS 엔진은 웹 API를 보았기 때문에 웹 API에 추가하면 setTimeout이 창고에서 팝업됩니다.getCurrency()도 스택에서 제거됩니다.
  • 타이머가 0s로 설정되어 있기 때문에 웹 API는 메시지 대기열로 리셋을 즉시 전송합니다. 따라서 이벤트 순환 검사 창고가 비어 있는지 확인하지만
  • setTimeout이 창고에서 삭제되자name()는 즉시 창고로 전송됩니다.
  • name () 호출 컨트롤러.Frank를 반환하고 스택에서 팝업한 로그입니다.
  • name()가 반환되고 스택에서 제거되었습니다.
  • 이벤트 순환은 호출 창고가 비어 있음을 알아차리고 메시지 대기열에서 호출 창고로 되돌려보냅니다.
  • 리셋 호출 컨트롤러.로그, 달러를 되돌려주고 창고에서 팝업합니다.콜백이 실행되고 스택에서 제거됩니다.우리의 코드는 마침내 실행을 완성했다.
  • 이 코드는 0밀리 초의 지연으로 setTimeout을 호출하면 지정한 시간 간격 후에 리셋을 실행하지 않습니다. 지연은 실행할 때 리셋을 실행하는 데 필요한 가장 짧은 시간입니다. 보장된 시간이 아닙니다.
    리셋은 다른 대기 메시지가 완성되고 창고가 정리될 때까지 기다려야 창고로 전송되고 돌아올 수 있습니다.

    결론


    자바스크립트가 실행될 때의 이해는 자바스크립트가 어떻게 실행되고 서로 다른 부분이 어떻게 조합되는지 이해하는 데 도움이 되며 자바스크립트가 우리가 알고 있는 위대한 언어가 되도록 합니다.나는 이 문장이 너로 하여금 이 기본 개념에 대해 견고한 이해를 가지게 할 수 있기를 바란다.안녕히 계세요!

    좋은 웹페이지 즐겨찾기