代码之家  ›  专栏  ›  技术社区  ›  steve

Javascript递归调用中的增量(i++)和(i+=1)

  •  1
  • steve  · 技术社区  · 7 年前

    我有一个关于JS增量(++)的问题。我知道这里有很多人问起了JS中++和+1的区别,但没有人在递归调用语句中提到这一点。

    问题: 我想递归地调用exec函数中的exec函数,但流动脚本工作不好。

    var exec = function(index){
        if(index<7){
            exec(index++);
        }
    }
    exec(0);
    
    output: Uncaught RangeError: Maximum call stack size exceeded
    

    所以我把我的剧本改成下面的,效果很好。

    var exec = function(index){
        if(index<7){
            exec(index+=1);
        }
    }
    exec(0);
    

    为什么在本例中它的行为会有所不同?我的递归调用是否错误?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Barmar    7 年前

    index++ 是后期增量。这意味着它会递增变量,但表达式的值是 古老的 价值因此:

    exec(index++);
    

    相当于:

    var oldindex = index;
    index += 1;
    exec(oldindex);
    

    因此,递归调用使用旧值,这意味着您继续使用相同的值递归调用,并且永远不会达到停止递归的限制。

    您需要使用pre-increment,它递增变量并返回 值:

    exec(++index);
    

    实际上,根本没有理由递增变量,因为您在该函数中从未再次使用过它。只需执行以下操作:

    exec(index + 1);
    
        2
  •  1
  •   CRice    7 年前

    与的问题 index++ 它是一个后期增量,所以它只增加 index 之后 已经传回了 exec . 使用预增量( ++index )应该可以工作,因为它将在将其传递到递归调用之前递增它。

    var exec = function(index){
        console.log(index)
        if(index<7){
            exec(++index);
        }
    }
    exec(0);