2015-10-26 1 views
-2

У меня есть следующие функции:Javascript рекурсии ошибка - функция внутри функции

function getRange() { 

    // generate a range of values from value up to climit 
    // excluding climit 
    var countup = function(value, climit) { 
     if (value < climit) { 
      console.log(value); 
      return countup(value + 1, climit); 
     } 
    }; 

    // gather input from the form 
    var x = document.getElementById("range_form").range_x.value; 
    var y = document.getElementById("range_form").range_y.value; 

    // Validate the input 
    if (isNaN(x) || isNaN(y)) { 
     console.log("Both values have to be integers!!!"); 
    } else { 
     // run the countup fonction 
     countup(x, y); 
    } 
} 

Теперь функционировать Countup (самостоятельно) работает, как ожидалось мной. Как только я включил функцию getRange, она перестала работать правильно. Когда я помещаю некоторые значения в форму (например, 2 и 9), вывод в консоли бесконечен 1111111111111111 , а затем ошибка: Uncaught RangeError: превышен максимальный размер стека вызовов.

Пожалуйста посоветуйте

+1

, поскольку вы видят '1111111111111111', что вы работаете со строкой вместо целого. Попробуйте обернуть переменные var x, y в 'parseInt' (например,' parseInt (document.getElementById ("range_form"). Range_x.value, 10) ' –

ответ

2

x и y являются строками. Поэтому

  • value + 1 причина конкатенация и
  • < делает лексическое сравнение (например, "211111" < "3" верно)

Преобразование ввода в число с помощью parseInt(..., 10):

var x = parseInt(document.getElementById("range_form").range_x.value, 10); 
+0

Спасибо вам обоим. Вот и все. В чем смысл, 10 на end? – Wasteland

+1

[Это радикс] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt): «Целое число от 2 до 36, которое представляет собой основание (основание в математических численных системах) указанной выше строки. Укажите 10 для системы с десятичной цифрой, обычно используемой людьми. Всегда указывайте этот параметр, чтобы устранить путаницу читателя и гарантировать предсказуемое поведение ». – Andy

+1

@Wasteland Он обеспечивает базу 10. Без нее, hexidecimal (например, 'parseInt (« 0xdeadbeef »)» основывает все шестнадцатеричное значение, в то время как parseInt («0xdeadbeef», 10) »анализирует только первый ноль и останавливается на' x') – apsillers

 Смежные вопросы

  • Нет связанных вопросов^_^