자 바스 크 립 트 매크로 작업 과 마이크로 작업 수행 순서
6553 단어 JavaScript큰 임무작은 임무실행 순서
JavaScript 는 단일 스 레 드 로 같은 시간 에 한 가지 일 만 할 수 있 고 앞의 일 을 다 해 야 뒤의 일 을 수행 할 수 있다 는 것 을 말한다.시간 이 걸 리 는 작업 을 만 났 을 때 뒤의 코드 를 실행 할 수 없습니다.
그 전에 동기 화 와 비동기 화 를 알 아야 돼 요.
1.동기 화 작업(synchronous)
console.log(123);
console.log(456);
for (let i = 1; i <= 5; i++) {
console.log(i);
}
말 그대로 순 서 를 따 르 는 거 예요.
2.비동기 작업(asynchronous)
setTimeout(() => {
console.log(' ');
}, 0)
console.log(' ');
일반적인 실행 순서에 따라 타 이 머 는 위 에 있 습 니 다. 타 이 머 를 출력 해서 오 트 만 을 출력 해 야 합 니 다. 마지막 으로 받 은 결 과 는 오 트 만 이 타 이 머 를 출력 하고 있 습 니 다. 그 이 유 는 setTimeout 이 비동기 미 션 이기 때 문 입 니 다.
지식 포 인 트 를 보충 하 다. setTimeout 의 타 이 머 는 몇 밀리초 지연 되 더 라 도 비동기 입 니 다. 브 라 우 저 마다 시간 이 다 릅 니 다.브 라 우 저 마다 차이 가 있 지만 0 최소 4 밀리초 로 정의 되 었 습 니 다.
2.퀘 스 트 대기 열(task queue)
위의 코드 를 통 해 setTimeout 이 비동기 임 을 알 수 있 습 니 다. 저희 가 집행 순서 우선 순 위 를 알 아 봤 어 요. 동기 코드>비동기 코드 그 러 니까 미 션 대기 열 에 서 는 두 가지 유형 으로 나 뉘 어 져 있 습 니 다.1.동기 화 미 션 입 니 다. 2.비동기 임무
1.실행 스 택
(1)모든 동기 화 작업 은 주 스 레 드 에서 실 행 됩 니 다.실행 스 택(execution context stack)을 만 듭 니 다.
(2)메 인 라인 외 에 도'작업 대기 열'(task quue)이 존재 합 니 다.비동기 작업 이 실행 결과 가 나 오 면'작업 대기 열'에 이 벤트 를 배치 합 니 다.
(3)'실행 스 택'의 모든 동기 화 작업 이 완료 되면 시스템 은'작업 대기 열'을 읽 고 안에 어떤 사건 이 있 는 지 봅 니 다.대응 하 는 비동기 작업 은 대기 상 태 를 끝내 고 실행 창고 에 들 어가 서 실행 을 시작 합 니 다.
(4)메 인 스 레 드 는 위의 세 번 째 단 계 를 계속 반복 하여 이벤트 순환(Event Loop)이 라 고 합 니 다.
간단히 배 를 들다
똑 같이 밥 먹 으 러 가요. 하지만 p2 는 나 가 는 시간 과정 을 줄 였 다.
간단하게 이해 한 후에 우 리 는 비동기 임무 중의 매크로 임 무 를 깊이 이해 합 니 다(macrotask )마이크로 태 스 크 )
개인 이해:매크로 임무 와 마이크로 임 무 는 두 가지 비동기 형태 로 이해 할 수 있다. 비동기 에는 두 아이의 매크로 임무 와 마이크로 임무 가 있다.
매크로 작업 의 방법:1.script(외부 동기 화 코드 로 이해 할 수 있 으 며 입구 로 사용 할 수 있 습 니 다) 2. setTimeout/setInterval
마이크로 미 션 방법:1.Promise 2.nextTick
그들의 실행 순 서 는 마이크로 작업 이 출력 매크로 작업 에 먼저 출력 되 는 것 이다.
증거 코드
setTimeout(() => {
console.log(' ');
}, 0)
new Promise((resolve) => {
console.log(' ')
resolve(' ')
}).then((res) => {
console.log(res);
})
console.log(' ');
오 뉴 프로 미스 는 구조 함 수 를 만 드 는 과정 이 동기 화 되 었 고,then 방법 은 비동기 화 되 었 음 을 주의 하 십시오. 그래서 코드 는 동기 화>마이크로 작업>매크로 작업 을 먼저 수행 합 니 다.
더욱 상세 하 게 그림 으로 실행 과정 을 묘사 하기 위해 서 아래 그림 이 있어 요.엄 청 나 게 공 부 했 어 요.
이 그림 들 을 좀 더 융합 시 켜 보 겠 습 니 다.
setTimeout 의 이 해 를 확장 합 니 다.
의문점 1 동기 코드 가 실행 되면 setTimeout 은 0 부터 시간 을 잽 니까?
setTimeout(() => {
console.log('setTimeout');
}, 1000);
console.log(' ');
for (let i = 0; i < 1000; i++) {
console.log('');
}
이때 밝 혀 야 할 것 은 제 가 for 순환 할 때 setTimeout 도 시간 을 잽 니 다. 그 는 타이머 모듈 을 열 것 이다.그래서 메 인 스 레 드 를 실행 할 때 타이머 모듈 이 이미 실행 되 기 시 작 했 기 때문에 1 초 를 기다 리 지 않 고 실행 할 것 이다.
(동기 실행 이 끝났다 고 생각 하지 말고 시간 을 재 세 요)
의문점 2:두 타이머 위의 타 이 머 는 아래 타 이 머 를 먼저 실행 합 니까?
테스트 는 우리 가 타이머 하나만 더 해서 누가 먼저 실행 하 는 지 보면 돼.
setTimeout(() => {
console.log('setTimeout1');
}, 2000);
setTimeout(() => {
console.log('setTimeout2');
}, 1000);
그 결과 타이머 가 두 개 있 으 면 시간 이 적 으 면 메 인 스 레 드 에 우선 넣 어 실행 하 는 것 으로 나 타 났 다.
의문점 3:변 수 를 0 으로 정의 합 니 다. 같은 타이머 이벤트 두 개 를 설정 하면 그 는 어떤 결 과 를 출력 합 니까?면접 문제
i = 0
setTimeout(() => {
console.log(++i); //1
}, 1000);
setTimeout(() => {
console.log(++i); //2
}, 1000);
지금 보면 타이머 매크로 작업 이 같이 수행 되 는 게 아니 라 는 걸 알 아야 돼 요. 순서대로!!매크로 퀘 스 트,마이크로 퀘 스 트 수행 순서 면접 문제
console.log('1');
setTimeout(function () {
console.log('2');
process.nextTick(function () {
console.log('3');
})
new Promise(function (resolve) {
console.log('4');
resolve();
}).then(function () {
console.log('5')
})
})
process.nextTick(function () {
console.log('6');
})
new Promise(function (resolve) {
console.log('7');
resolve();
}).then(function () {
console.log('8')
})
setTimeout(function () {
console.log('9');
process.nextTick(function () {
console.log('10');
})
new Promise(function (resolve) {
console.log('11');
resolve();
}).then(function () {
console.log('12')
})
})
답:첫 번 째 실행 외부 동기 화 코드:1 7
2 라운드 마이크로 퀘 스 트 수행:6 8
제 3 라운드 매크로 퀘 스 트 첫 번 째 setTimeout:동기 화 2 4 미 션 5 두 번 째 setTimeout:동기 화 9 11 작은 임무 10 12
전체 답안: 1、7 、6、8、2、4、3、5、9、11、10、12
자 바스 크 립 트 매크로 퀘 스 트 와 마이크로 퀘 스 트 수행 순서 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.자 바스 크 립 트 매크로 퀘 스 트 와 마이크로 퀘 스 트 수행 순서 에 관 한 더 많은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.