繁体   English   中英

JavaScript-运行函数时声明的变量未定义错误

[英]JavaScript - Declared variable not defined error when function is run

我正在尝试创建一个计算器,该计算器可以通过在输入中键入年份然后单击按钮来说明一年中第13个星期五的数量,然后将显示一个alert()并显示结果:

 <script> function Fridaythe13(j) { var count = document.getElementById('year').value; var count = 0; for (var month=0; month<12; month++) { var d = new Date(j,month,13); if(d.getDay() == 5){ count++; } } return count; } document.getElementById("run").addEventListener("click", function(){ alert(Fridaythe13(count)); }) </script> <input type="text" name="year" id="year" /> <section class="material"> <div class="actions"> <button type="button" id="run">Run</button> </div> </section> 

当我单击按钮时,它表示未定义count变量,但是我用输入(“ year”)声明了该变量,所以我不明白...预先感谢您的帮助!

您的某些逻辑已被破坏,这是一个有效的示例。

首先,您在函数中两次定义了变量count

另外,从点击处理程序中,您正在将参数count传递给内部函数,但此变量也未声明。

考虑为变量使用更好的名称。 例如year而不是j

也喜欢使用let/const而不是var来声明变量。

 function fridayThe13(year) { let count = 0; for (let month = 0; month < 12; month++) { const date = new Date(year, month, 13); if (date.getDay() == 5) { count++; } } return count; } document.getElementById("run").addEventListener("click", () => { const year = document.getElementById('year').value; alert(fridayThe13(year)); }) 
 <input type="text" name="year" id="year" /> <section class="material"> <div class="actions"> <button type="button" id="run">Run</button> </div> </section> 

这里是一个更短的方式做到这一点,利用功能性风格,配有mapreduce总结的值:

function fridayThe13(year) {
    return [...Array(12).keys()] // [0, 1, 2,... 11]
        .map(month => new Date(year, month, 13).getDay() == 5)
        .reduce((accum, val) => accum += val, 0);
}

变量计数在函数Fridaythe13定义(两次@GetOffMyLawn指出),并且警报正在尝试在该函数之外访问它。 我相信您希望您的代码看起来像这样:

var count = document.getElementById('year').value;

function Fridaythe13(j) {
  var count = 0;
  for (var month = 0; month < 12; month++) {
    var d = new Date(j, month, 13);
    if (d.getDay() == 5) {
      count++;
    }
  }
  return count;
}

document.getElementById("run").addEventListener("click", function() {
    alert(Fridaythe13(count));
})

但是为了避免混淆,我建议将第一个声明的count变量更改为另一个变量名。 也许是这样的:

var thisYear = document.getElementById('year').value;

function Fridaythe13(j) {
  var count = 0;
  for (var month = 0; month < 12; month++) {
    var d = new Date(j, month, 13);
    if (d.getDay() == 5) {
      count++;
    }
  }
  return count;
}

document.getElementById("run").addEventListener("click", function() {
  alert(Fridaythe13(thisYear));
})

您在错误的函数( document.getElementById('year').value )中声明了计数。 将其移至其他功能,它将起作用。

 function Fridaythe13(j) { var count = 0; for (var month = 0; month < 12; month++) { var d = new Date(j, month, 13); if (d.getDay() == 5) { count++; } } return count; } document.getElementById("run").addEventListener("click", function() { var count = document.getElementById('year').value; alert(Fridaythe13(count)); }) 
 <input type="text" name="year" id="year" /> <section class="material"> <div class="actions"> <button type="button" id="run">Run</button> </div> </section> 

您定义计数两次。 移动第一个声明并将其重命名。

     <script>
     function Fridaythe13(year) {
            var count = 0;
            for (var month=0; month<12; month++) {
                var d = new Date(year,month,13);
                if(d.getDay() == 5){
                  count++;
                }
            }
            return count;                            
        }

        document.getElementById("run").addEventListener("click", function 
        (){
            var selected_year = document.getElementById('year').value;

            alert(Fridaythe13(selected_year));
        })
  </script>

您可以使用map()函数收集每个月的所有第13天,然后仅过滤星期五。

 const count = [1,2,3,4,5,6,7,8,9,10,11,12] .map(m=>new Date(2019,m,13).getDay()) .filter(d=>d==5) .length; console.log(count); 

认识到Fri 13表示星期日为1号,并使用年和月的偏移量,因此可以算术地执行此操作而无需引用日期对象(注意:此版本仅适用于公历和大于0的年份)

function countFri13(year) {
  var count = 0;
  const leapYear = (year % 4 && !((year % 100) && !(year % 400)))
  var yearOffset = (1 + 5 * ((year - 1) % 4) + 4 * ((year - 1) % 100) + 6 * ((year - 1) % 400)) % 7;
  if (leapYear) {
    var monthOffsets = [0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 5]
  } else {
    monthOffsets = ([0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 4])
  }
  for (var month = 0; month < 12; month++) {
    if ((yearOffset + monthOffsets[month]) %  7 === 0) {
      count++;
    }
  }
  return count;
}

// in ES6...

function countFri13es6(year) {
  let count = 0,
    monthOffsets = [];
  const yearOffset = (1 + 5 * ((year - 1) % 4) + 4 * ((year - 1) % 100) + 6 * ((year - 1) % 400)) % 7;
  (year % 4 && !((year % 100) && !(year % 400))) ? monthOffsets = [0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 5]: monthOffsets = ([0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 4])
  for (var month = 0; month < 12; month++) {
    if ((yearOffset + monthOffsets[month]) % 7 === 0) count++;
  }
  return count;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM