我正在玩弄以下代码:
function recaller(){
while(x-- > 0)recaller();
}
var x = 10;
recaller();
alert(x); //-11?
但我惊讶地发现 x
现在的值是 -11
我后来在 while
上面添加了 alert(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
是否大于零 (no),递减 (-2
) 并返回 - 第一次展开堆栈;在其 while 循环中,检查
x
是否大于零 (no),递减 (-3
) 并返回 - 返回顶级流程
x=-3
关于javascript - 这个-11从哪里来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9863904/