Javascript 这个-11是从哪里来的?

Javascript 这个-11是从哪里来的?,javascript,Javascript,我在玩下面的代码: function recaller(){ while(x-- > 0)recaller(); } var x = 10; recaller(); alert(x); //-11? 但是我惊讶地发现x现在拥有-11 我后来添加了警报(x)位于上方,而,以查看它是否正确显示了10到0的数字,它确实显示了 有人能解释一下-11是从哪里来的吗?这次我的调试技能失败了,我不知道如何继续测试您正在递归到recaller,因此x在递归结束时会多次递减-每次递归,当您退出该

我在玩下面的代码:

function recaller(){
    while(x-- > 0)recaller();
}

var x = 10;
recaller();
alert(x); //-11?
但是我惊讶地发现
x
现在拥有
-11

我后来添加了
警报(x)位于
上方,而
,以查看它是否正确显示了
10
0
的数字,它确实显示了


有人能解释一下
-11
是从哪里来的吗?这次我的调试技能失败了,我不知道如何继续测试您正在递归到
recaller
,因此
x
在递归结束时会多次递减-每次递归,当您退出该递归调用时,将再次检查
while
循环条件,并且该表达式递减
x
。考虑一下如果我们从<代码> x=2 < /代码>:

会发生什么?
  • x
    为2,我们称之为
    recaller
    (第一次)进入其while循环,检查
    x
    是否大于零,递减并
  • x
    为1,我们调用
    recaller
    (第二次)进入其while循环,该循环检查
    x
    是否大于零,递减并
  • x
    为0,我们调用
    recaller
    (第三次)进入while循环,检查
    x
    是否大于零,递减(
    -1
    )并返回
  • 将堆叠展开一次至第二次;在while循环中,检查
    x
    是否大于零(否),递减(
    -2
    )并返回
  • 第一次将堆叠展开一次;在while循环中,检查
    x
    是否大于零(否),递减(
    -3
    )并返回
  • 返回顶层流
  • x=-3
  • 执行此操作时:

    var x = 10;
    alert(x--); // Displays 10
    alert(x); // Displays 9
    
    x——是后减量运算符,即在主计算之后执行。因此:

    if(x-- > 10) { 
      // Executes when x is > 10 before decrementing
    }
    
    您正在执行递归循环。也就是说,你做到了:

    function recaller(){
        while(x-- > 0)recaller();
    }
    
    其中:

    • 将x与10进行比较
    • 递归调用
    • 递减x

    由于您的密码是
    x>0
    ,因此当x=0时,它将退出对
    recaller
    的最内部调用,然后递减一次,退出到下一个递归调用,以此类推,直到达到-11。

    您可能知道,
    x--
    递减
    x
    ,然后在递减之前返回其值。我们也可以这样编写您的代码:

    function recaller() {
        while(true) {
            var oldX = x;
            x--;
            if(!(oldX < 0)) {
                break;
            }
            recaller();
        }
    }
    
    function recaller() {
        indent();
        log("Recaller called");
        while(true) {
            log("In loop, before decrement and test");
            var oldX = x;
            x--;
            log("In loop; decremented");
            if(!(oldX > 0)) {
                log("Test failed");
                break;
            }
            log("Test succeeded");
            log("In loop, before recursion");                    
            recaller();
            log("In loop, after recursion");
        }
        log("About to return from recaller");
        dedent();
    }
    
    您可以在JSFiddle上使用


    查看日志,即使测试失败,您也可以看出它正在将其递减(降至零以下),结果是负数。

    var x=10之后,您可以更好地使用
    控制台.log
    而不是
    警报
    @gdoron更新的问题
    var x=10;recaller()不是这样。
    if
    是您在我的小提琴中获得正确输出的原因。看一看。现在你得到了
    -9
    +1我希望我能像那样调试,这会节省我很多时间。