【问题标题】:Increment(i++) and (i+=1) in Javascript recursive callJavascript递归调用中的增量(i++)和(i+=1)
【发布时间】:2018-06-21 10:56:24
【问题描述】:

我有一个关于 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);

为什么它在这个例子中表现得不同?我的递归调用错了吗?

【问题讨论】:

  • 这看起来像是一个关于 postincrement vs preincrement ++i vs i++ 的问题。如果您尝试++i,它应该可以工作。
  • 在这种情况下,您可能应该只使用i+1
  • @raina77ow 这个问题与优化无关。出于性能原因,这个重复的问题是关于在循环中使用哪个。
  • 相关问题:onetwothree。仍然不确定这个比其他的好。 )

标签: javascript recursion increment


【解决方案1】:

index++ 的问题在于它是一个后增量,所以它只会增加 index 的值它已经被传递回 exec。使用预增量 (++index) 应该可以工作,因为它会在将其传递给递归调用之前对其进行增量。

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

【讨论】:

    【解决方案2】:

    index++ 是后增量。这意味着它增加了变量,但表达式的值是 old 值。所以:

    exec(index++);
    

    相当于:

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

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

    你需要使用pre-increment,它增加变量并返回new值:

    exec(++index);
    

    实际上,根本没有理由增加变量,因为您再也不会在该函数中使用它。做吧:

    exec(index + 1);
    

    【讨论】:

      猜你喜欢
      • 2014-02-22
      • 1970-01-01
      • 2022-07-20
      • 2020-03-23
      • 2019-12-11
      • 1970-01-01
      • 2012-07-10
      • 2017-08-11
      • 2020-05-24
      相关资源
      最近更新 更多