2013-08-29 2 views

답변

10

이렇게하는 이유는 자바 스크립트 스레드가 대기열에서 대기중인 다른 이벤트를 트리거 할 수있는 기회를 허용하기 위해서입니다.

자바 스크립트는 단일 스레드입니다. 이벤트가 트리거되면 현재 실행중인 코드가 완료된 경우에만 이벤트가 실행됩니다.

0 시간 지연을 사용하여 setTimeout을 사용하면 callback 함수 호출이 새로운 컨텍스트의 일부이고 JSS 인터프리터에게 현재 컨텍스트가 완료되었으며 현재 코드 블록이 완료되었음을 알 수 있습니다. 즉, JS는 callback()에 전화하기 전에 다른 이벤트를 처리해야하는지 확인하기 전에 기회를 얻습니다. 이 비록

이 사이트의 전반적인 성능을위한 좋은 수 있습니다 즉시 호출되는 callback() 자체를 지연시킬 수있다 : 처리해야 할 수 있습니다

다른 이벤트가 이벤트 및 기타 UI 트리거를 클릭 포함한다. 사용자에게 실행 기회를주지 않으면 사용자 인터페이스가 느려지거나 응답하지 않을 수 있습니다.

2

setTimeoutcallback(); 이상 또는 callback.call(); 실행하여 루프 함수 호출의 다른 어떤 setTimeout

resolve: function (data) { 
    this.promise.okCallbacks.forEach(function(callback) { 
     window.setTimeout(function() { 
     callback(data) 
     }, 0); 
    }); 
    }, 

자바 스크립트 프로세스는 무료입니다.

call을 사용하면 즉시 콜백을 실행하고 다른 모든 것을 차단합니다.

+0

으로 설정되어 있지만 시간은 0으로 설정됩니다. –

+0

@ Moein7tl : 실제로 타임 아웃의 하한은 0보다 큽니다 (IIRC는 인기있는 브라우저의 경우 4 밀리 초와 비슷합니다). 따라서 0은 "당신이 그것에 접근 할 수있게되자 마자"를 의미합니다. 아마도 제로 타임 아웃을 사용하는 사람들은 이것에 대해 알고 그것을 의도적으로 수행합니다. – Jon

+1

@ Moein7tl - 예, "시간이 경과했다"고 말한 후에 **와 **를 말했습니다. – Quentin

2

setTimeout(func,0)은 즉시 호출되지 않습니다.

단순히 콜백을 사용하여 비동기 함수를 시뮬레이트합니다. 에서는 setTimeout()에 의해 실행

function asyncFunc(callback) { 
    console.log("step1"); 
    setTimeout(callback,0); 
    console.log("step2"); 
} 

asyncFunc(function() {console.log("async step")}); 
/* output: 
step1 
step2 
async step 
*/ 

https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

코드, 그것은 그래서 별도의 실행 컨텍스트에서 실행

호출 된 함수에 별도의 실행 컨텍스트에서 실행 하지만 그것을 실행하기 전에 자바 스크립트는 단일 스레드에서 실행되는 자바 스크립트로 인해 현재 실행을 종료해야합니다.

다른 작업을 실행하기 전에 종료해야하기 때문에 현재 실행 중 시간은 중요하지 않습니다.

작업이 끝나기 전에 무한 루프가있는 경우 (예 : 콜백이 호출되지 않음).

1

setTimeout() 지정된 시간이 경과 한 후에 한 번 호출 할 함수를 등록 할 수 있습니다.

Window 개체의 setTimeout() 메서드는 지정된 밀리 초가 경과 한 후 이 경과 한 후에 실행할 함수를 예약합니다. setTimeout()clearTimeout()으로 전달 된 일 수있는 값을 반환하여 예약 된 기능의 실행을 취소합니다.

setTimeout()을 0ms의 시간으로 호출하면 지정한 기능이 바로 으로 호출되지 않습니다. 대신 대기열에 배치되어 이후 대기중인 이벤트 핸들러가 실행을 마치면 "가능한 한 빨리"호출됩니다.

관련 문제