我试图让一个递归函数在jQuery中工作,但是我得到了以下异常:
'未捕获RangeError:超出最大调用堆栈大小'
我的理解是,递归函数必须以某种方式无限运行,但我无法弄清楚为什么会发生这种情况。感谢...
jQuery.fn.reduceNumber = function(numberToReduce) {
if (numberToReduce < 10 || numberToReduce == 11 || numberToReduce == 22 || numberToReduce == 33){
return numberToReduce;
} else {
var newNumberToReduce = numberToReduce.toString().substring(0,1) + numberToReduce.toString().substring(1,2);
return ($(this).reduceNumber(newNumberToReduce));
}
}
$(document).ready(function(){
$("#foo").html($(this).reduceNumber(12));
});
答案 0 :(得分:0)
因为你陷入无限循环。您正在呼叫reduceNumber(12)
。由于它与第一个if()
语句不匹配,因此转到第二个:
var newNumberToReduce = numberToReduce.toString().substring(0,1) + numberToReduce.toString().substring(1,2);
领导newNumberToReduce
成为...... 12
!然后调用reduceNumber(12)
,它会一次又一次地执行相同的操作,直到超出最大堆栈大小。
答案 1 :(得分:0)
第一次调用reduceNumber并传递12
转到功能
不小于10,或等于11或22或33
其他
也是如此newNumberToReduce是12(1)的第一个字符,12(2)的第二个字符
所以newNumberToReduce是12
再次调用reduceNumber函数传入12(再次)
因此infinte loop
答案 2 :(得分:0)
更改此行:
var newNumberToReduce = numberToReduce.toString().substring(0,1) + numberToReduce.toString().substring(1,2);
到此:
var newNumberToReduce = (numberToReduce.toString().substring(0,1) | 0) + (numberToReduce.toString().substring(1,2) | 0);
将根据您的数字(1 + 2 = 3)
创建一个新数字