몇 가지 면접 문제로 JavaScript 실행 메커니즘 보기
6211 단어 Javascript실행 메커니즘
앞말
자바스크립트의 운행 환경에 따라 단일 루트로 잠그고 작업은 줄을 서서 수행해야 한다. 만약에 사이트 자원이 비교적 크면 브라우저 불러오는 속도가 매우 느리지만 실제로는 그렇지 않다. 여러분은 즉시 동기화와 비동기화를 생각했을 것이다.
이른바 동기화와 비동기화도 줄을 서는 것이지만 줄을 서는 곳은 다르다.
동기식 및 비동기식
동기화 작업은 주 스레드 대기열에 들어가고, 비동기화 작업은 이벤트 대기열에 들어갑니다.
동기화 작업과 비동기화 작업은 서로 다른 대기열에 들어간다. 즉, 위에서 말한 서로 다른 곳에서 줄을 서는 것이다.
동기화 작업이 주 스레드에 들어가고 비동기화 작업이 이벤트 대기열에 들어가며 주 스레드 작업이 완료되고 이벤트 대기열에 실행을 기다리는 작업이 주 스레드에 들어가서 이벤트 대기열에 작업이 모두 실행될 때까지 실행됩니다.
식욕을 돋우는 요리
console.log('a')
setTimeout(function(){
console.log('b')
}, 200)
setTimeout(function(){
console.log('c')
}, 0)
console.log('d')
a d c b위쪽에서 아래로, 메인 라인에 들어갈 때 메인 라인에 들어갈 때, 이벤트 대기열에 들어갈 때 이벤트 대기열에 들어갈 것이다.
그러면 메인 라인에 콘솔이 존재합니다.log ('a') 및 console.log('d'), 타이머 setTimeout은 일정 시간 실행을 지연합니다. 말 그대로 비동기적인 작업이 이벤트 대기열에 들어가서 메인 작업이 끝날 때까지 기다렸다가 메인 라인에 들어갑니다.
타이머의 지연 시간은 0이 즉각 실행되는 것이 아니라 다른 타이머보다 먼저 메인 라인에 들어가 실행되는 것을 나타낸다.
한 판 더하다
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i)
}, 1000)
}
결과: 10개매번 for 순환이 setTimeout을 만나면 이벤트 대기열에 넣고 실행을 기다립니다. 모든 순환이 끝날 때까지 i는 전역 변수로 순환이 끝난 후 i=10, 다시 setTimeout을 실행할 때 i의 값은 10이고 결과는 10개입니다.
var를 let으로 바꿉니다. 변수 역할 영역이 다르고 let은 현재 순환 중입니다. 따라서 이벤트 대기열에 들어간 타이머는 매번 i가 다르고 마지막 인쇄 결과는 0 1 2...구.
매크로 작업 마이크로 작업
자주 말하는 동기화 작업과 비동기화 작업을 제외하고는 매크로 작업, 마이크로 작업으로 나눌 수 있다
주요 매크로 작업: 전체 스크립트 scriptsetTimeoutsetTimeout...
주요 마이크로퀘스트:promise.then...
프로세스 수행:
1. 전체 스크립트 스크립트는 매크로 작업으로 시작
2. 마이크로퀘스트를 만나 마이크로퀘스트 대기열에 밀어넣고, 매크로퀘스트를 매크로퀘스트 대기열에 밀어넣기
3. 매크로 작업 완료, 실행 가능한 마이크로 작업 있는지 확인
4. 실행 가능한 마이크로 퀘스트가 발견되면 모든 마이크로 퀘스트를 완료합니다
5. 모든 작업이 완료될 때까지 새 매크로 작업을 시작합니다.
Promise 한 판.
const p = new Promise(resolve => {
console.log('a')
resolve()
console.log('b')
})
p.then(() => {
console.log('c')
})
console.log('d')
결과: a b d c1. 전체 스크립트가 매크로 작업 대기열에 들어가서 실행하기
2.promise 생성 즉시 실행, 인쇄 ab
3. 약속을 만나다.then 마이크로퀘스트 대기열 진입
4. 콘솔을 만난다.log('d') 인쇄 d
5. 전체 코드는 매크로 작업으로 실행됩니다. 실행할 수 있는 마이크로 작업이 있습니다. 마이크로 작업을 시작하고 c를 인쇄합니다.
setTimeout(function(){
console.log('setTimeout')
}, 0)
const p = new Promise(resolve => {
console.log('a')
resolve()
console.log('b')
})
p.then(() => {
console.log('c')
})
console.log('d')
결과: a b d c setTimeout1.setTimeout 매크로 작업 대기열 진입
2.promise 생성 즉시 실행, 인쇄 ab
3. 약속을 만나다.then 마이크로퀘스트 대기열 진입
4. 콘솔을 만난다.log('d') 인쇄 d
5. 실행 가능한 마이크로 작업이 있습니다. c 인쇄
6. 마이크로 작업 완료, 새로운 매크로 작업 시작, setTimeout 실행 시작, setTimeout 인쇄
setTimeout(function(){
console.log('setTimeout')
}, 0)
const p = new Promise(resolve => {
console.log('a')
resolve()
console.log('b')
})
p.then(() => {
console.log('c')
setTimeout(function(){
console.log('then setTimeout')
}, 0)
})
console.log('d')
결과: a b d c setTimeout then 의 setTimeout1. 동상
2. 마이크로 작업 인쇄 c를 실행하고 setTimeout을 만나 매크로 작업 대기열에 밀어넣기
3. 타이머 지연 시간이 같으면 매크로 작업을 순서대로 실행하고 setTimeoutthen의 setTimeout을 인쇄합니다
타이머를 좀 더 넣다
console.log('a');
new Promise(resolve => {
console.log('b')
resolve()
}).then(() => {
console.log('c')
setTimeout(() => {
console.log('d')
}, 0)
})
setTimeout(() => {
console.log('e')
new Promise(resolve => {
console.log('f')
resolve()
}).then(() => {
console.log('g')
})
}, 100)
setTimeout(() => {
console.log('h')
new Promise(resolve => {
resolve()
}).then(() => {
console.log('i')
})
console.log('j')
}, 0)
결과: a b c h j i d e f g1. 인쇄 a
2.promise 즉시 실행, 인쇄 b
3.promise.then 마이크로퀘스트 대기열 밀어넣기
4.setTimeout 매크로 작업 대기열 밀어넣기
5. 전체 코드 실행 완료, 마이크로 작업 시작, c 인쇄, setTimeout 매크로 작업 대기열 밀어넣기 실행 대기
6. 실행 가능한 마이크로 작업이 없으면 매크로 작업을 시작하고 타이머는 지연 시간에 따라 줄을 서서 실행합니다
7. hj, promise 인쇄.then 밀어넣기 마이크로퀘스트 대기열
8. 실행 가능한 마이크로 작업, 인쇄 i, 매크로 작업 계속, 인쇄 d
9. 100으로 지연되는 매크로 작업, e f 인쇄, 마이크로 작업 인쇄 g, 모든 작업 완료
단순 테스트
console.log('start')
a().then(() => {
console.log('a_then')
})
console.log('end')
function a() {
console.log('a_function')
return b().then((res) => {
console.log('res', res)
console.log('b_then')
return Promise.resolve('a ')
})
}
function b() {
console.log('b_function')
return Promise.resolve(' ')
}
결과: start a_function b_function endres 반환값 b_then a_then상기 예시의 절차 설명에 근거하여 이것을 생각하고 이해를 깊이 있게 하다
총결산
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java,python,JavaScript 및 jquery 순환 문장의 차이2. 자바 순환 문장 조건 문장이 무엇이든지 간에 코드 블록은 최소한 한 번 실행되고do/while 순환을 사용할 수 있습니다.do/while 문법: 즉, 코드 블록을 먼저 집행한 다음에 조건이 성립되었는지 판단하고...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.