我不明白为什么我的代码不起作用。简单地说,有三个功能级别:启动进程的访问功能、作为程序核心的DOB功能以及其中的几个功能,其中包括为了便于识别而标记的PROBLEM功能。
如果我使用直接输入的数字运行 DOB 函数,它就会起作用。但是,当用户从下拉菜单中选择数字时,其中的 PROBLEM 函数会失败。在更改为带有临时变量的访问函数之前,我有一个 jquery go 按钮,只是为了获得相同的结果。我尝试将 PROBLEM 函数从 switch 更改为 if-elses 并更改名称,但我修改的任何内容都不起作用。
这个问题已经困扰我近一周了。我对编码和自学是全新的,所以我可能会错过一些明显的范围或对象引用问题。任何帮助将不胜感激。 (代码已经简化,所有关键组件都完好无损。)((DOB 函数中的闰年函数需要相同的临时变量似乎可以工作。))
更新:做了一些小改动。测试了很多。问题功能仍然是罪魁祸首,我不明白为什么。如果我输入数值,它可以正常工作,但它不会获取我尝试从表单存储的值。
<!DOCTYPE html>
<html>
<body>
<form id="myForm" class="form">
<p><b> 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);
导致 CDOY
和 BDOY
始终为 未定义
。试试这个:
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/