How does setTimeout prevent potential stackoverflow

后端 未结 2 372
伪装坚强ぢ
伪装坚强ぢ 2021-01-22 08:58

An example :

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        setTimeout( nextListItem, 0);
                


        
2条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-22 09:37

    Set timeout would not cause stack overflow, because it is asynchronous. It will just put the callback to the event queue and not block the execution.

    In the first case:

    setTimeout just puts the callback to event queue and the parent function exits after without busying the stack.
    Even though the timeout is 0 ms, it will be called in the next event loop, thus not blocking the code in execution

    var nextListItem = function() {
        var item = list.pop();
    
        if (item) {
             setTimeout( nextListItem, 0);
        }
    };
    

    In the second case:

    Parent call the child function putting new entry into stack, even though the parents is not cleared from the stack.
    Eventually more recursive calls would blow the stack.

    var nextListItem = function() {
            var item = list.pop();
        
            if (item) {        
               nextListItem();
            }
        };
    

提交回复
热议问题