#javascript #jquery #debugging
#javascript #jquery #отладка
Вопрос:
Когда я запускаю этот код в Chrome, он сообщает «превышен максимальный размер стека вызовов».
http://codepen.io/tcadams9/pen/JRLyOq
if (randomNum === 0 || randomNum === 1)
return 1;
for (var i = randomNum - 1; i >= 1; i--) {
num *= i;
}
return factorial();
$("#button2").click(factorial);
Комментарии:
1. это вся функция? Plx дает нам заголовок функции и определение случайного числа
2. Если
randomNum
значение равно 0,for
оно становится бесконечным.3. Да, это целая функция. Если щелкнуть ссылку codepen, в ней должен быть весь код. Когда я использовал этот код в консоли Chrome, он работал, но как только я пытаюсь связать его с HTML-страницей, он все портит. Я думаю, что именно здесь мой код может быть неправильным.
Ответ №1:
Вы там путаете переменные с элементами DOM. Значение элемента DOM с идентификатором «randomNum» не равно переменной randomNum
. Чтобы получить значение, вам нужно $("#randomNum").val()
. Похоже, это сочетание рекурсивного и нерекурсивного подхода. Вам нужно это очистить: явный:
randomNum = 6; //set the value before
function factorial () {
var num =1;
for (var i = randomNum - 1; i >= 1; i--) {
num *= i;
}
return num;
}
и
$("#button2").click(function () {
randomNumber = $("#randomNumber").val();
$("#Factorial").html(
factorial()
)
})
или
Рекурсивный
function factorial (randomNum) {
if (randomNum === 0 || randomNum === 1)
return 1;
return randomNum * factorial(randomNum-1);
}
однако вы не можете вызвать эту функцию через «click», поскольку у нее не будет randomNumber
аргумента.
Чтобы исправить это, вам нужно изменить регистрацию evenHandler на
$("#button2").click(function () {
$("#Factorial").html(
factorial($("#randomNumber").val())
)
})
Проверял, все работало нормально.