JS의 이벤트 실행 메커니즘에 대한 심층 분석
이 기사는 코드 조각의 인쇄 순서를 분석하여 JavaScript의 이벤트 실행 메커니즘에 대한 심층적인 이해를 제공할 것입니다.
얼마 전 필기시험 문제 때문에 조금 헷갈렸어요. 오늘은 JS의 이벤트 실행 메커니즘을 철저하게 분석하겠습니다. [관련 권장사항: javascript 학습 튜토리얼]
먼저 코드를 살펴보세요
친구들이 인쇄 순서를 써볼 수 있습니다
싱글 스레드
JS
주로 브라우저 스크립팅 언어로서 Js
의 주요 목적은 JS
가 JS인 경우 단일 스레드여야 함을 결정하는 DOM을 작동하는 것입니다. code>는 Java와 비슷합니다. 또한 두 개의 스레드가 동시에 DOM을 작동하는 경우 브라우저는 이를 어떻게 수행해야 합니까? <code>JS
主要作为浏览器的脚本语言,Js
的主要用途是操作DOM,这就决定了JS
必须是单线程,如果JS
如Java一样是多线程,如果两个线程同时操作DOM,那么浏览器应该怎么执行呢?
JS
的发布其实是为了蹭Java的热度,其中编写这门语言的时间并不久,所以这也就是为什么JS是单线程的原因
JS执行机制
JS既然是单线程,那么必然会对任务进行一个排序。所有的任务都将按照一个规则执行下去。
同步任务
异步任务
同步任务和异步任务进入执行栈中,JS会先判断任务的类型
是同步任务,直接进入主线程
是异步任务,进入
Event Table
中,注册回调函数Event Queue
同步任务全部执行结束,JS会
Event Queue
中读取函数执行这个过程会反复执行,直到全部任务执行结束。这就是我们常说的
事件循环
JS如何判断执行栈为空
emmmm,我不知道。。。。JS应该有一套自己独有的逻辑去判断执行栈是否为空。
异步任务
异步的任务执行顺序为:宏任务——>微任务
异步任务可分为
宏任务
微任务
常见的宏任务
I/0
setTimeout
setInterval
常见的微任务
Promise
.then
.catch
答案
vite 之前配置的一个插件,版本有些问题,不要管这个红色报警
分析
开始了
是一个同步任务,最先进入执行栈中执行
task()
函数,a
是一个同步任务,进入执行栈中async/await 是异步转同步的过程,第一行代码会同步执行,以下的代码会异步。
b
作为一个同步任务进入执行栈中a end
成为了异步任务的微任务,进入执行栈中,
目前为止,同步任务队列依次是 开始了
, a
, b
目前为止,异步任务队列依次是 宏任务: setTimeout
微任务:a end
如果没有后续代码,打印顺序如下
那么问题来了,不是说宏任务会比微任务提前执行吗,为什么setTimeout
打印在a end
之后呢?
看这张图
setTimeout 作为了宏任务进入了任务队列。所以造成了这种原因
通俗来讲:
async await 导致了微任务的产生,但是这个微任务所属于当前的宏任务。所以会先执行a end
,执行完毕判断当前宏任务结束。执行下一个宏任务,打印出了setTimeout
继续走流程
c
由于Promise的转化,变为同步任务进入到任务队列中c end
作为Promise衍生的微任务进入任务队列-
d
JS
의 출시는 실제로 Java의 인기를 활용하기 위한 것입니다. 언어가 작성된 지 얼마 되지 않아서 JS가 단일 스레드인 이유입니다🎜🎜JS 실행 메커니즘🎜🎜🎜JS는 단일 스레드이므로 작업을 정렬해야 합니다. 모든 작업은 규칙에 따라 실행됩니다. 🎜
- 🎜동기 작업🎜
- 🎜비동기 작업🎜
🎜🎜동기 작업과 비동기 작업이 실행 스택에 들어가고, JS는 먼저 작업 유형을 결정합니다🎜
- 🎜는 동기 작업이며 메인 스레드에 직접 들어갑니다🎜
- 🎜는 비동기 작업입니다.
이벤트 테이블
을 입력하고 콜백 함수이벤트 큐를 등록합니다.
🎜 - 🎜모든 동기화 작업이 실행된 후 JS는
이벤트 큐
에서 함수를 읽고 실행합니다.🎜 - 🎜이 프로세스는 모든 작업이 실행될 때까지 반복적으로 실행됩니다. 이것이 우리가 흔히
이벤트 루프
라고 부르는 것입니다🎜
🎜JS는 실행 스택이 비어 있는지 어떻게 판단합니까🎜 h4>🎜 음, 모르겠어요. . . . JS에는 실행 스택이 비어 있는지 확인하는 고유한 논리가 있어야 합니다. 🎜🎜비동기 작업🎜🎜🎜비동기 작업 실행 순서는 다음과 같습니다: 매크로 작업 -> 마이크로 작업 🎜🎜비동기 작업은 🎜
- 🎜 매크로로 나눌 수 있습니다. 🎜
- 🎜마이크로 작업🎜
🎜일반적인 매크로 작업🎜
- 🎜 I/ 0🎜
- 🎜setTimeout🎜
- 🎜setInterval🎜
🎜공통 마이크로태스크🎜
- 🎜Promise🎜
- 🎜.then🎜
- 🎜.catch🎜
답변🎜🎜vite 이전에 구성된 플러그인이 있습니다. 버전에 문제가 있습니다. 이 빨간색 알람은 무시하세요🎜🎜
🎜분석🎜
- 🎜
시작됨는 동기 작업이며 실행 스택에 가장 먼저 들어갑니다. 🎜
- 🎜
task()
함수를 실행합니다. 🎜
- 🎜스택의 async/await는 비동기에서 동기로 진행되는 프로세스이며, 다음 코드는 비동기로 실행됩니다.
b
는 동기 작업으로 실행 스택에 들어갑니다. 🎜
- 🎜
a end
는 비동기 작업의 마이크로태스크가 되어 실행 스택에 들어갑니다. 🎜 li>
🎜🎜지금까지 동기화 작업 대기열은 Started
, a
, b
🎜🎜🎜🎜지금까지, 비동기 작업 대기열은 차례로 매크로 작업입니다: setTimeout
마이크로 작업: a end
🎜🎜🎜후속 코드가 없는 경우 , 인쇄 순서는 다음과 같습니다🎜🎜🎜
🎜 🎜그렇다면 매크로 작업이 마이크로 작업보다 먼저 실행된다는 뜻이 아닌가요? 왜 a end
뒤에 setTimeout
가 인쇄되나요? 🎜🎜이 사진을 보세요
🎜🎜
🎜🎜setTimeout은 매크로 작업으로 작업 대기열에 들어갑니다. 그래서 그 이유는 🎜🎜평신도의 용어로 말하면: 🎜🎜async Wait는 마이크로 작업의 생성으로 이어지지만 이 마이크로 작업은 현재 매크로 작업에 속합니다. 따라서 a end
가 먼저 실행되고, 실행 후에는 현재 매크로 작업이 종료된 것으로 판단됩니다. 다음 매크로 작업을 실행하고 setTimeout
을 인쇄하세요🎜🎜계속해서 프로세스를 따르세요🎜
- 🎜
c
Promise 변환으로 인해 동기 작업이 되어 작업 큐에 들어갑니다🎜
- 🎜
c end
파생된 마이크로 작업으로 작업 큐에 들어갑니다. Promise🎜 - 🎜
d
는 동기화 작업으로 작업 대기열에 들어갑니다🎜
지금까지는 동기 작업 대기열
a
b
c
d
대기열
엔드 마이크로 Task
c end Microtask
setTimeout Macrotask
- 🎜 매크로로 나눌 수 있습니다. 🎜
- 🎜마이크로 작업🎜
🎜일반적인 매크로 작업🎜
- 🎜 I/ 0🎜
- 🎜setTimeout🎜
- 🎜setInterval🎜
🎜공통 마이크로태스크🎜
- 🎜Promise🎜
- 🎜.then🎜
- 🎜.catch🎜
답변🎜🎜vite 이전에 구성된 플러그인이 있습니다. 버전에 문제가 있습니다. 이 빨간색 알람은 무시하세요🎜🎜
🎜분석🎜
- 🎜
시작됨는 동기 작업이며 실행 스택에 가장 먼저 들어갑니다. 🎜
- 🎜
task()
함수를 실행합니다. 🎜
- 🎜스택의 async/await는 비동기에서 동기로 진행되는 프로세스이며, 다음 코드는 비동기로 실행됩니다.
b
는 동기 작업으로 실행 스택에 들어갑니다. 🎜
- 🎜
a end
는 비동기 작업의 마이크로태스크가 되어 실행 스택에 들어갑니다. 🎜 li>
🎜🎜지금까지 동기화 작업 대기열은 Started
, a
, b
🎜🎜🎜🎜지금까지, 비동기 작업 대기열은 차례로 매크로 작업입니다: setTimeout
마이크로 작업: a end
🎜🎜🎜후속 코드가 없는 경우 , 인쇄 순서는 다음과 같습니다🎜🎜🎜
🎜 🎜그렇다면 매크로 작업이 마이크로 작업보다 먼저 실행된다는 뜻이 아닌가요? 왜 a end
뒤에 setTimeout
가 인쇄되나요? 🎜🎜이 사진을 보세요
🎜🎜
🎜🎜setTimeout은 매크로 작업으로 작업 대기열에 들어갑니다. 그래서 그 이유는 🎜🎜평신도의 용어로 말하면: 🎜🎜async Wait는 마이크로 작업의 생성으로 이어지지만 이 마이크로 작업은 현재 매크로 작업에 속합니다. 따라서 a end
가 먼저 실행되고, 실행 후에는 현재 매크로 작업이 종료된 것으로 판단됩니다. 다음 매크로 작업을 실행하고 setTimeout
을 인쇄하세요🎜🎜계속해서 프로세스를 따르세요🎜
- 🎜
c
Promise 변환으로 인해 동기 작업이 되어 작업 큐에 들어갑니다🎜
- 🎜
c end
파생된 마이크로 작업으로 작업 큐에 들어갑니다. Promise🎜 - 🎜
d
는 동기화 작업으로 작업 대기열에 들어갑니다🎜
지금까지는 동기 작업 대기열
a
b
c
d
대기열
엔드 마이크로 Task
c end Microtask
setTimeout Macrotask
- 🎜
시작됨는 동기 작업이며 실행 스택에 가장 먼저 들어갑니다. 🎜
- 🎜
task()
함수를 실행합니다. 🎜 - 🎜스택의 async/await는 비동기에서 동기로 진행되는 프로세스이며, 다음 코드는 비동기로 실행됩니다.
b
는 동기 작업으로 실행 스택에 들어갑니다. 🎜 - 🎜
a end
는 비동기 작업의 마이크로태스크가 되어 실행 스택에 들어갑니다. 🎜 li>
Started
, a
, b
🎜🎜🎜🎜지금까지, 비동기 작업 대기열은 차례로 매크로 작업입니다: setTimeout
마이크로 작업: a end
🎜🎜🎜후속 코드가 없는 경우 , 인쇄 순서는 다음과 같습니다🎜🎜🎜
🎜 🎜그렇다면 매크로 작업이 마이크로 작업보다 먼저 실행된다는 뜻이 아닌가요? 왜 a end
뒤에 setTimeout
가 인쇄되나요? 🎜🎜이 사진을 보세요
🎜🎜
🎜🎜setTimeout은 매크로 작업으로 작업 대기열에 들어갑니다. 그래서 그 이유는 🎜🎜평신도의 용어로 말하면: 🎜🎜async Wait는 마이크로 작업의 생성으로 이어지지만 이 마이크로 작업은 현재 매크로 작업에 속합니다. 따라서 a end
가 먼저 실행되고, 실행 후에는 현재 매크로 작업이 종료된 것으로 판단됩니다. 다음 매크로 작업을 실행하고 setTimeout
을 인쇄하세요🎜🎜계속해서 프로세스를 따르세요🎜
- 🎜
c
Promise 변환으로 인해 동기 작업이 되어 작업 큐에 들어갑니다🎜
- 🎜
c end
파생된 마이크로 작업으로 작업 큐에 들어갑니다. Promise🎜 - 🎜
d
는 동기화 작업으로 작업 대기열에 들어갑니다🎜
지금까지는 동기 작업 대기열
a
b
c
d
대기열
엔드 마이크로 Task
c end Microtask
setTimeout Macrotask
c
Promise 변환으로 인해 동기 작업이 되어 작업 큐에 들어갑니다🎜c end
파생된 마이크로 작업으로 작업 큐에 들어갑니다. Promise🎜d
는 동기화 작업으로 작업 대기열에 들어갑니다🎜a
b
c
d
엔드 마이크로 Task
c end Microtask
setTimeout Macrotask
인쇄 순서는 다음과 같습니다
Postscript
제가 이해한 JS 실행 메커니즘이 정확하지 않을 수 있습니다. 상사가 지적했다.
【추천 관련 동영상 튜토리얼: 웹 프론트엔드】
위 내용은 JS의 이벤트 실행 메커니즘에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











WebSocket 및 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법 소개: 지속적인 기술 개발로 음성 인식 기술은 인공 지능 분야의 중요한 부분이 되었습니다. WebSocket과 JavaScript를 기반으로 한 온라인 음성 인식 시스템은 낮은 대기 시간, 실시간, 크로스 플랫폼이라는 특징을 갖고 있으며 널리 사용되는 솔루션이 되었습니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 음성 인식 시스템을 구현하는 방법을 소개합니다.

WebSocket과 JavaScript: 실시간 모니터링 시스템 구현을 위한 핵심 기술 서론: 인터넷 기술의 급속한 발전과 함께 실시간 모니터링 시스템이 다양한 분야에서 널리 활용되고 있다. 실시간 모니터링을 구현하는 핵심 기술 중 하나는 WebSocket과 JavaScript의 조합입니다. 이 기사에서는 실시간 모니터링 시스템에서 WebSocket 및 JavaScript의 적용을 소개하고 코드 예제를 제공하며 구현 원칙을 자세히 설명합니다. 1. 웹소켓 기술

JavaScript 및 WebSocket을 사용하여 실시간 온라인 주문 시스템을 구현하는 방법 소개: 인터넷의 대중화와 기술의 발전으로 점점 더 많은 레스토랑에서 온라인 주문 서비스를 제공하기 시작했습니다. 실시간 온라인 주문 시스템을 구현하기 위해 JavaScript 및 WebSocket 기술을 사용할 수 있습니다. WebSocket은 TCP 프로토콜을 기반으로 하는 전이중 통신 프로토콜로 클라이언트와 서버 간의 실시간 양방향 통신을 실현할 수 있습니다. 실시간 온라인 주문 시스템에서는 사용자가 요리를 선택하고 주문을 하면

WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법 오늘날의 디지털 시대에는 점점 더 많은 기업과 서비스에서 온라인 예약 기능을 제공해야 합니다. 효율적인 실시간 온라인 예약 시스템을 구현하는 것이 중요합니다. 이 기사에서는 WebSocket과 JavaScript를 사용하여 온라인 예약 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. WebSocket이란 무엇입니까? WebSocket은 단일 TCP 연결의 전이중 방식입니다.

JavaScript 및 WebSocket: 효율적인 실시간 일기 예보 시스템 구축 소개: 오늘날 일기 예보의 정확성은 일상 생활과 의사 결정에 매우 중요합니다. 기술이 발전함에 따라 우리는 날씨 데이터를 실시간으로 획득함으로써 보다 정확하고 신뢰할 수 있는 일기예보를 제공할 수 있습니다. 이 기사에서는 JavaScript 및 WebSocket 기술을 사용하여 효율적인 실시간 일기 예보 시스템을 구축하는 방법을 알아봅니다. 이 문서에서는 특정 코드 예제를 통해 구현 프로세스를 보여줍니다. 우리

JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

사용법: JavaScript에서 insertBefore() 메서드는 DOM 트리에 새 노드를 삽입하는 데 사용됩니다. 이 방법에는 삽입할 새 노드와 참조 노드(즉, 새 노드가 삽입될 노드)라는 두 가지 매개 변수가 필요합니다.

JavaScript는 웹 개발에 널리 사용되는 프로그래밍 언어인 반면 WebSocket은 실시간 통신에 사용되는 네트워크 프로토콜입니다. 두 가지의 강력한 기능을 결합하면 효율적인 실시간 영상 처리 시스템을 만들 수 있습니다. 이 기사에서는 JavaScript와 WebSocket을 사용하여 이 시스템을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 첫째, 실시간 영상처리 시스템의 요구사항과 목표를 명확히 할 필요가 있다. 실시간 이미지 데이터를 수집할 수 있는 카메라 장치가 있다고 가정해 보겠습니다.
