函数内函数内的函数似乎丢失了javascript

时间:2015-09-19 16:42:13

标签: javascript scoping object-reference

我无法理解为什么我的代码无效。简单地说,有三个功能级别:一个启动进程的访问功能,一个作为程序核心的DOB功能,以及包含一个我为了识别而标记的问题功能的几个功能。

如果我使用我直接输入的数字运行DOB功能,它可以工作。但是当用户从下拉菜单中选择数字时,其中的PROBLEM功能失败。在更改为具有临时变量的访问函数之前,我有一个jquery go按钮,以获得相同的结果。我尝试将PROBLEM功能从开关更改为if-elses更改名称,但我修改的内容没有任何效果。

这个问题困扰了我近一个星期。我自己编码和教学是全新的,所以我可能会错过一些明显的范围或对象参考问题。任何帮助将不胜感激。 (代码已经简化,所有关键组件都完好无损。)((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>

3 个答案:

答案 0 :(得分:0)

PROBLEM不会返回任何值,这意味着

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

CDOYBDOY中的结果始终为undefined。试试这个:

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

除此之外:我强烈建议您在调试器中轻松完成代码,这样您就可以准确了解每一步的发生情况。祝你好运,不要放弃!

答案 1 :(得分:0)

我很欣赏这个委员会和所有的建议。我想通过在函数函数中声明函数内部的问题来要求它。我已经能够通过使用:

解决问题
    return DOB(Number(Bmonth), Number(Bdom), Number(Byear));

我没有意识到变量没有被转移为实际数字。去图。

答案 2 :(得分:-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;
}

然后在DOB功能中,您可以像

一样调用此代码段
var MAD = PROBLEM(Bmonth, Cdom);

对所有函数调用执行此操作并重新测试。