2017-04-19 4 views
0

이렇게 주어진 함수. . .setTimout을 통해 자신을 호출하는 함수가 오버플로를 일으킬 수 있습니까?

function self_time() { 
    console.log('hi'); 
    setTimeout(self_time, 1000); 
} 

잠재적으로 스택 오버플로가 발생할 수 있습니까? 나는 이것이 정확히 재귀 호출이 아니며 자바 스크립트가 비동기이지만, 리소스를 소모하지 않고 무한히 실행될 수 있다고 생각 하는가?

또한 이와 같은 try-catch 상황은 어떻습니까? . .

function try_it() { 
    try { 
    console.log('im trying something...'); 
    } catch(e) { 
    //i failed so im going to try again in 1 second 
    setTimeout(try_it, 1000); 
    } 
} 

함수가 무기한 실패하고 있다고 말하면 리소스가 부족합니까?

나는 알고있다. setInterval은 대안이지만, 성공할 때 더 이상 간헐적으로 점검 할 필요가 없다.

+1

나는 잘 모르겠지만, 당신은에 allways VAR'사용할 수 있습니다 intervalID = setInterval (function, 1000);'성공했을 때'clearInterval (intervalID);을 할 수 있습니다. 당신이 요구하는 것이 아니라는 것을 알고 있습니다. 그러나 항상 옵션입니다. –

+0

감사합니다. – rbtLong

+4

두 함수 모두 리소스를 소모하지 않고 무기한 실행할 수 있습니다. –

답변

2

어느 기능도 리소스가 부족합니다. 브라우저가 setTimeout에 전달 된 함수를 비동기 적으로 호출하기 때문에 실제로 재귀가 발생하지 않습니다. 내가 아래에했던 것처럼 당신은, 그러나, 자신의 attemptEvery 유틸리티를 굴려서 조금 더 명확한 논리를 만들 수 있습니다

function attemptEvery (ms, fn) { 
 
    var token = setInterval(function() { 
 
    try { 
 
     fn.apply(this, [].slice.call(arguments, 2)) 
 
     clearInterval(token) 
 
    } catch (e) {} 
 
    }, ms) 
 
} 
 

 
attemptEvery(100, function() { 
 

 
    dangerousOperation() 
 
    console.log('Success!') 
 
}) 
 

 
function dangerousOperation() { 
 
    console.log('Attempting dangerous operation!') 
 
    if (Math.random() < .6) throw Error() 
 
}

관련 문제