setTimeout 메서드는 지정된 밀리초 후에 함수나 계산된 표현식을 호출하는 데 사용됩니다. 이 글은 주로 setTimeout의 js 함수 실행 과정을 소개하는데, 필요한 친구들이 참고하면 도움이 될 것 같습니다.
for (var i = 0; i < 5; i++) { setTimeout(function () { console.log(i) }, i * 1000); } console.log(i);
뭐? 이것은 오래전에 5를 인쇄한 다음 5를 인쇄하고 6개의 5가 인쇄될 때까지 매초마다 5를 인쇄하는 구현 방법이 아닌가? 그렇다면 질문이 생깁니다. 0,1,2,3,4,5를 순서대로 인쇄하려면 어떻게 해야 합니까? 사실 이전에는 두 가지 방법이 있다는 것을 알고 있었습니다. 하나는 다음과 같습니다.
function log(i){ setTimeout(function(){ console.log(i) },i*1000) }; for (var i = 0; i < 5; i++) { log(i) ; } console.log(i);
또 하나는 이렇습니다.
for(var i=0;i<5;i++){ (function(e){ setTimeout(function(){ console.log(e) },i*1000); })(i); }; console.log(i);
농담을 두려워하지 마세요. 이전에는 이 두 기능이 실제로 어떤 용도로 사용되었는지 이해하지 못했기 때문에 억지로 기억하고 이렇게 수정했습니다. . 하지만 지금은 강박 장애가 있습니다! 그래서 천천히 분석해 보니 위의 코드는 다음과 같이 구분할 수 있습니다. 조건이 충족될 때
setTimeout(function(){ console.log(i) },0*1000);
setTimeout(function(){ console.log(i) },1*1000);i 조건이 충족된 경우
setTimeout(function(){ console.log(i) },2*1000);i=3; 조건이 충족된 경우
setTimeout(function(){ console.log(i) },3*1000);i=5, 조건이 충족되지 않습니다. 루프에서 빠져나온 다음 for 루프 후에 console.log(i)를 실행하고 마지막으로 5를 인쇄하고 매초마다 5를 인쇄합니다.
정말 흥미롭습니다. setTimeout 내부의 .log는 for 루프 외부의 console.log 후에 실행됩니다. 모직 천? => "queue"라는 단어를 깨닫기 전까지 대기열은 매크로 작업 대기열(Macro Task)과 마이크로 작업 대기열(Micro Task)로 구분됩니다. javascript:
macro-task에는 script(전체 코드) , setTimeout, setInterval이 포함됩니다. , setImmediate, I/O, UI 렌더링.
마이크로 작업에는 process.nextTick, Promises, Object.observe, MutationObserver
setTimeout(function(){ console.log(i) },4*1000);
설명 =>
1 먼저 스크립트 태스크 소스가 먼저 실행되고, 전역 컨텍스트가 스택에 푸시됩니다.
2. 스크립트 작업 소스 코드가 실행 중에 setTimeout을 만나면 매크로 작업으로 콜백 함수를 자체 대기열에 넣습니다.
3. 스크립트 작업 소스의 코드는 실행 중에 Promise 인스턴스를 발견합니다. Promise 생성자의 첫 번째 매개변수는 현재 작업을 직접 실행하면 대기열에 넣지 않으므로 이때는 1이 출력됩니다.
console.log('golb1'); setTimeout(function() { console.log('timeout1'); new Promise(function(resolve) { console.log('timeout1_promise'); resolve(); setTimeout(function(){ console.log('time_timeout') }); }).then(function() { console.log('timeout1_then') }) setTimeout(function() { console.log('timeout1_timeout1'); }); }) new Promise(function(resolve) { console.log('glob1_promise'); resolve(); setTimeout(function(){ console.log('prp_timeout') }); }).then(function() { console.log('glob1_then') })
如果你的执行结果是:golb1=>glob1_promise=>glob1_then=>timeout1=>timeout1_promise=>timeout1_then=>prp_timeout=>time_timeout=>timeout1_timeout1,
可能异步队列算是入门了吧!~~上面的代码看起来有点杂乱,可能用asyns搭配await改造一下会更好,但是这或多或少是鄙人从setTimeout中得到的见解吧
相关推荐:
JavaScript如何使用setTimeout来实现轮循动画的实例详解
위 내용은 js 함수 실행 과정을 보기 위해 setTimeout을 설명하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!