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我希望我能像那样调试,这会节省我很多时间。