setTimeout(fn,200)
, 여기서 지정한 시간은 프로그램이 실행되기 시작하자마자 계산된다는 뜻인가요? 아니면 메인 스레드의 작업이 완료될 때까지 기다렸다가 계산을 시작하기 전에 비동기 작업 목록을 다시 호출해야 합니까?
世界只因有你2017-07-05 11:05:30
설명하기가 좀 복잡합니다
우선 Javascript가 단일 스레드라는 점을 이해해야 합니다. 단일 스레드는 모든 작업을 대기열에 넣어야 함을 의미합니다. 그런 다음 모든 작업은 동기 작업과 비동기 작업이라는 두 가지 범주로 나뉩니다! 동기 작업: 메인 스레드에서 실행되는 작업의 경우 이전 작업이 완료된 후에만 다음 작업이 실행됩니다! 비동기 작업: 메인 스레드에 들어가지 않고 "작업 큐"에 들어가는 작업입니다. 메인 스레드의 작업이 완료되면 메인 스레드가 "작업 큐"를 실행합니다.
실제 실행 시간이 반드시 200ms 이후인 것은 아니며 더 긴 시간 이후일 수도 있습니다(메인 스레드의 동기화 코드 실행 시간에 따라 다름). setTimeout(fn,200)
,当到200ms时,fn
会被放进“任务队列”,而“任务队列”必须要等到主线程已有的代码执行完才会执行fn
,所以当程序执行到setTimeout(fn,200)
这一行时,时间就开始计算,但是fn
欧阳克2017-07-05 11:05:30
간단히 말하면setTimeout(fn,200)
需要等到当前函数调用栈(主进程上的同步任务)清空之后才开始执行,会在下一轮事件循环(主线程从"任务队列"中读取事件)开始时执行,setTimeout
이벤트만 "작업 대기열"에 삽입됩니다. 여기서 설정한 시간은 이벤트 루프의 다음 라운드가 시작되는 시간을 기준으로 한 간격입니다.