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

时间:2019-01-28 21:45:40

标签: javascript calculator

我正在尝试创建一个计算器,该计算器可以通过在输入中键入年份然后单击按钮来说明一年中第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')声明了它,所以我不明白...谢谢您的帮助!< / p>

6 个答案:

答案 0 :(得分:7)

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

首先,您在函数中两次定义了变量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);
}

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

答案 2 :(得分:0)

您在错误的函数(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>

答案 3 :(得分:0)

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

     <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>

答案 4 :(得分:0)

您可以使用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);

答案 5 :(得分:0)

认识到Fri 13表示第1个星期日,并使用年和月的偏移量,可以在不参考日期对象的情况下进行算术运算(请注意:此版本仅适用于公历且年份大于0)

_