我正在尝试创建一个计算器,该计算器可以通过在输入中键入年份然后单击按钮来说明一年中第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>
答案 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>
使用功能样式和map
和reduce
对值求和是一种更短的方法:
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)>
_