2017-12-04 20 views
0

JS를 배웠고 설명 할 수 없거나 웹에서 대답을 찾지 못했습니다.JS. 기능의 다른 장소에서 setTimeout을 사용하면 다른 결과가 발생합니다.

두 개의 유사한 기능이 다음과 같습니다 COUNT2은 약 8000 밀리 취하면서 COUNT1 기능, arount 5000 밀리 소요 크롬에서

function count1(){ 
    if (i<(1e9+1)-1e6){ 
     setTimeout(count1,0) 
    } 
    do{ 
     i++ 
    } while(i%1e6!=0) 

    if (i==1e9){ 
     console.log('Done1 in '+(Date.now()-start)+'ms') 
    } 
    } 
    function count2(){ 

    do{ 
     i++ 
    } while(i%1e6!=0) 

    if (i==1e9){ 
     console.log('Done2 in '+(Date.now()-start)+'ms') 
    } 
    if (i<(1e9+1)-1e6){ 
     setTimeout(count2,0) 
    } 
    } 

    let start=Date.now(); 
    let i=0; 
// count1(); 
    count2(); 

    //why count2 is faster? 

</script> 

. 유일한 차이점은 "setTimeout"코드가 다른 위치에 있다는 것입니다. 코드의 차이가 너무 커서 시간이 많이 걸리는 이유를 이해하는 데 도움을 주시기 바랍니다.

미리 감사드립니다.

답변

0

첫 번째 기능에서는 타이머를 시작한 다음 타이머와 병렬로 루프를 실행합니다. 두 번째 함수에서는 루프를 완료 한 후 타이머를 시작합니다 (연속적으로)

+0

예, 두 경우 모두 setTimeout (count1,0)에서 시작된 코드는 나머지 코드 (루프)가 끝난 후에 실행됩니다. (어떻게 올바르게 setTimeout (.., 0) 메서드가 작동하는지 이해한다면) – Dophin

+0

아니요. setTimeout의 타이머는 호출하는 function-call의 끝이 아니라'setTimeout' 함수가 호출 될 때 즉시 시작됩니다. – AhmadWabbi

+0

doc : https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout "값 0을 사용합니다. 즉, 가능한 한 빨리"즉시 "실행합니다. ". 현재 상황에서 "최대한 빨리"는 루프가 완료된 직후 (병렬이 아님)를 의미합니다. 내가 잘못? – Dophin