2015-09-19 4 views
1

Я не могу понять, почему мой код не работает. Проще говоря, существует три уровня функций: функция доступа для инициирования процесса, функция DOB, которая является ядром программы, и несколько функций, включая функцию PROBLEM, которую я обозначил для идентификации.Функция внутри функции внутри функции, кажется, теряет временные переменные в javascript

Если я запускаю функцию DOB с номерами, которые я вводил напрямую, это работает. Но когда пользователь выбирает номера из выпадающего меню, функция ПРОБЛЕМА в состоянии сбоя. У меня была кнопка jquery go, прежде чем перейти к функции доступа с временными переменными только для получения тех же результатов. Я попытался изменить функцию PROBLEM с помощью переключателей на if-elses для изменения имени, но ничего, что я изменил, работало.

Эта проблема превзошла меня почти неделю. Я новичок в кодировании и обучении, поэтому мне может не хватать какой-то очевидной проблемы определения области или объекта. Любая помощь будет принята с благодарностью. (Код был упрощен, и все ключевые компоненты остались нетронутыми.) ((Кажется, что работает функция Leap Year в функции DOB, нуждающейся в тех же временных переменных.))

Обновление: внесены незначительные изменения. Протестировано много. Проблемная функция остается виновницей, и я не понимаю, почему. Если я ввожу числовые значения, он работает нормально, но он не принимает значения, которые я пытался сохранить из формы.

<!DOCTYPE html> 
<html> 
<body> 
     <form id="myForm" class="form"> 
       <p><b>&nbsp;Month</b></p> 
       <select id="Bmonth" class="date"> 
        <option value="1">January</option> 
        <option value="2">February</option> 
        <option value="3">March</option> 
       </select> 
       <p><b>Day</b></p> 
       <select id="Bdom" class="date"> 
        <option value="1">1</option> 
        <option value="2">2</option> 
        <option value="3">3</option> 
       </select> 
       <p><b>Year</b> </p> 
       <select id="Byear" class="date"> 
        <option value="2015">2015</option> 
        <option value="2014">2014</option> 
        <option value="2013">2013</option> 
       </select> 
      <p class="clear"> 
       <input type="button" onclick="access()" value="Submit"> 
      </p> 
     </form> 

<script> 
    function access() { 
     var tempElement = document.getElementById("Bmonth"); 
     Bmonth = tempElement.options[tempElement.selectedIndex].value; 

     var tempElement = document.getElementById("Bdom"); 
     Bdom = tempElement.options[tempElement.selectedIndex].value; 

     var tempElement = document.getElementById("Byear"); 
     Byear = tempElement.options[tempElement.selectedIndex].value; 

     return DOB(Bmonth, Bdom, Byear); 
    } 

/*This function determines time intervals 
between birth date and current date.*/ 
function DOB(Bmonth, Bdom, Byear) { 

    //Get Current Date// 
    var today = new Date(); 
    var Cmonth = today.getMonth(); 
    var Cdom = today.getDate(); 
    var Cyear = today.getFullYear(); 

    function PROBLEM(Month, DOM) { 
    switch (Month) { 
    case 1: return 0 + DOM; break; 
    case 2: return 31 + DOM; break; 
    case 3: return 59+ DOM; break; 
     } 
    } 
    /*Find Current and Birth Day of Year 
    By Calling Function Above */ 
    CDOY = PROBLEM(Cmonth + 1, Cdom); 
    BDOY = PROBLEM(Bmonth, Bdom); 

    //Find Differences// 
    var DayCount = CDOY - BDOY; 
    var YearCount = Cyear - Byear; 

// This function determines the number of leap years// 
    function Leap(Bmonth, Bdom, Byear, Cmonth, Cyear) { 
     var LeapYear = 0; 
     if ((Byear % 4 == 0 && (Byear % 100 !== 0 || Byear % 400 == 0)) && 

(Bmonth >= 3 || Bmonth == 2 && Bdom == 29)) { 
LeapYear--; 
} 
     if ((Cyear % 4 == 0 && (Cyear % 100 !== 0 || Cyear % 400 == 0)) && 

Cmonth < 3) { 
LeapYear--; 
} 
     for (var i = Cyear; i >= Byear; i--) { 
      if ((i % 4 == 0) && ((i % 100 !== 0) || (i % 400 == 0))) 
{ LeapYear++; }; 
} 
     return LeapYear; 
} 
//Call function above// 
    var LeapYear = Leap(Bmonth, Bdom, Byear, Cmonth, Cyear); 

//Find Total Days// 
    var TotalDays = 365 * YearCount + DayCount + LeapYear; 

//Find Variables// 
var Days = TotalDays; 
var Hours = Days * 24; 
var Minutes = Hours * 60; 
var Seconds = Minutes * 60; 

var Output, Units; 
//Use Random Number Generator to Vary Output with Units// 
var random = Math.ceil(Math.random() * 4); 
switch (random) { 
case 1: Output = Days; Units = 'days old.'; break; 
case 2: Output = Hours; Units = 'hours old.'; break; 
case 3: Output = Minutes; Units = 'minutes old.'; break; 
case 4: Output = Seconds; Units = 'seconds old.'; break; 
default: Output = 0; Units = 'units.'; break; 
} 

var Greeting; 
//Use Random Number Generator to Vary Greeting// 
var r = Math.ceil(Math.random() * 3); 
switch (r) { 
case 1: Greeting = 'Congrats!'; break; 
case 2: Greeting = 'Yes!'; break; 
case 3: Greeting = 'Check it.'; break; 
} 
function commas(x) { 
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); 
} 
var Number = commas(Output); 

return window.alert(Greeting + "You are " + Number + " " + Units); 
} 
</script> 
</body> 
</html> 
+0

'case 1: return = 0 + DOM; break; 'все после ключевого слова' return' никогда не будет оценено. Удалите '=' в этих строках. Вы также можете удалить все 'break;' там. – connexo

+0

Это была моя ошибка. Я постоянно обновляю то, что у меня есть. Функция, которую я выполняю, отлично работает при вводе фактических чисел, но она не будет принимать числа, сохраненные в качестве временных переменных из раскрывающегося меню в этой конкретной функции. – CJW

ответ

0

PROBLEM не возвращает никакого значения, что означает, что

CDOY = PROBLEM(Cmonth + 1, Cdom); 
BDOY = PROBLEM(Bmonth, Bdom); 

Результаты в CDOY и BDOY всегда быть undefined. Попробуйте это:

function PROBLEM(Month, DOM) { 
    switch (Month) { 
    case 1: return 0; 
    case 2: return 31; 
    case 3: return 59; 
    } 
} 

Помимо: Я настоятельно рекомендую получить удобную пошаговый код в отладчике, так что вы можете точно понять, что происходит на каждом этапе пути. Удачи, и не сдавайся!

+0

Спасибо за совет и поддержку.Ваше решение намного проще, но оно все еще не работает. Я буду работать над отладчиками. Я попробовал пару в Virtual Studio, но это не позволило мне ничего сделать из-за ошибки ссылки на объект. Firebug, казалось, пропустил его, но, возможно, я сделал это неправильно. – CJW

-1

Никогда не объявляйте объявление функции (именованной функции) в другом объявлении функции. Например. извлеките это из родительской функции и верните результат.

function PROBLEM(Month, DOM) { 
    var MAD; 
    switch (Month) { 
     case 1: MAD = 0; break; 
     case 2: MAD = 31; break; 
     case 3: MAD = 59; break; 
    } 
    return MAD; 
} 

Тогда в функции ДОБ вы называете этот фрагмент как

var MAD = PROBLEM(Bmonth, Cdom); 

Сделайте это для всех вызовов функций и перепроверять его.

+0

Я пробовал это для одной функции, но она все еще не работала. Неправильно ли я пытаюсь запустить всю программу как функцию? – CJW

+0

Когда вы извлекли каждую вложенную функцию вне любой функции, сделан большой хороший шаг. Таким образом, вы можете использовать эти функции и для других задач. Когда некоторые из них являются функциями, которые имеют смысл только в определенной функции (вложенной), для вас подходит [закрытие (анонимная функция)] (http://www.w3schools.com/js/js_function_closures.asp). Затем следующая задача - отладить ваш код, посмотреть [здесь] (http://www.w3schools.com/js/js_debugging.asp). –

+2

_ «Никогда не объявлять функцию функции в другом объявлении функции» _ довольно тяжело. Есть много случаев, когда все в порядке. –

0

Я ценю эту доску и все предложения. Думаю, я просил об этом, заявляя о проблемах внутри функций в функциях функций. Я смог решить эту проблему, используя:

return DOB(Number(Bmonth), Number(Bdom), Number(Byear)); 

Я не понимал, что переменные не передаются как действительные числа. Идите фигуру.

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

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