javascript - 函数内函数内的函数似乎丢失了javascript中的临时变量

标签 javascript scoping object-reference

我不明白为什么我的代码不起作用。简单地说,有三个功能级别:启动进程的访问功能、作为程序核心的DOB功能以及其中的几个功能,其中包括为了便于识别而标记的PROBLEM功能。

如果我使用直接输入的数字运行 DOB 函数,它就会起作用。但是,当用户从下拉菜单中选择数字时,其中的 PROBLEM 函数会失败。在更改为带有临时变量的访问函数之前,我有一个 jquery go 按钮,只是为了获得相同的结果。我尝试将 PROBLEM 函数从 switch 更改为 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>

最佳答案

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

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

导致 CDOYBDOY 始终为 未定义。试试这个:

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

旁白:我强烈建议您在调试器中轻松地单步调试代码,这样您就可以准确地理解每一步发生的情况。祝你好运,不要放弃!

关于javascript - 函数内函数内的函数似乎丢失了javascript中的临时变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32670692/

相关文章:

Python - 修改与覆盖对象引用

javascript - jqgrid不更新本地数据

javascript - 是否可以配置 iOS 原生 HTML5 日期选择器?

javascript - 使用 Form 元素转换/更改 Div 元素

C++ pqxx postgresql 离散连接类,作用域类指针

c# - 对象引用未设置为对象实例”

javascript - 评估模板字符串和类实例

javascript - 谷歌地图 JS 代码 - "this.activeInfoWindow.close()"- 范围和这个

java - Web 应用程序中的哪个元素应该负责加载应用程序范围的数据?

java - Hadoop MapReduce : Strange Result when Storing Previous Value in Memory in a Reduce Class (Java)