Javascript setInterval() - 为什么我的 "input" 参数变为未定义?
Javascript setInterval() - Why does my "input" parameter changes to undefined?
我一直在研究以下代码,但无法弄清楚为什么我的函数参数 "input" 在 1 秒后变为未定义?
代码如下:
<div id="new_time"></div>
<div id='input'></div>
<script>
var mins = 0;
var hrs = 0;
var secs = 0;
var test = 0;
function time_calc(input)
{
document.getElementById('new_time').innerHTML = secs++;
document.getElementById('input').innerHTML = input;
if (secs>59)
{
mins += 1;
secs = 0;
if (mins>59)
{
hrs += 1;
mins = 0;
}
}
while (secs == input)
{
clearInterval(secs_inc);
}
document.getElementById('new_time').innerHTML = hrs + ":" + mins + ":" + secs;
}
time_calc(20);
var secs_inc = setInterval(time_calc, 1000);
</script>
你期望它是什么?您在一秒钟后使用 setInterval
调用函数 time_calc
。但它就是这样调用的,没有参数。所以参数 input
没有得到值,所以它是未定义的。
当您尝试将其分配给元素时,它会被翻译成文本 undefined
。
解决这个问题的一种方法是将它包装在一个函数中。这可以是一个匿名函数:
var secs_inc = setInterval(function(){timecalc(20)}, 1000);
打扮得体的例子:
function time_calc(input) {
document.getElementById('input').innerText = input;
}
setInterval(function(){time_calc(20)}, 3000);
<span id="input">Wait for it....</span>
如果你调用setInterval(time_calc(20), 1000)
,你实际上调用了函数time_calc()
,并将结果传递给setInterval。
但是你不能调用它。您需要将函数本身传递给 setInterval,以便 setInterval 稍后可以调用它。这就是为什么在您的原始代码段中您不带括号传递 time_calc
的原因。这只是没有调用的功能。
我所做的是将对 time_calc(20)
的调用包装在另一个也没有参数的(匿名)函数中。现在它是由 setInterval
调用的匿名包装函数,后者又调用 time_calc
并带有 一个参数。
顺便说一句,它不一定是匿名函数。我认为对于这种情况,这是最简单的解决方案,但在他的回答中将实际命名函数声明为 @sudhAnsu63 也应该有效。
试试这样调用你的函数。
var secs_inc = setInterval(new function(){
time_calc(20);}, 1000);
Or
function Calltime()
{
time_calc(20);
}
var secs_inc = setInterval(Calltime, 1000);
我一直在研究以下代码,但无法弄清楚为什么我的函数参数 "input" 在 1 秒后变为未定义?
代码如下:
<div id="new_time"></div>
<div id='input'></div>
<script>
var mins = 0;
var hrs = 0;
var secs = 0;
var test = 0;
function time_calc(input)
{
document.getElementById('new_time').innerHTML = secs++;
document.getElementById('input').innerHTML = input;
if (secs>59)
{
mins += 1;
secs = 0;
if (mins>59)
{
hrs += 1;
mins = 0;
}
}
while (secs == input)
{
clearInterval(secs_inc);
}
document.getElementById('new_time').innerHTML = hrs + ":" + mins + ":" + secs;
}
time_calc(20);
var secs_inc = setInterval(time_calc, 1000);
</script>
你期望它是什么?您在一秒钟后使用 setInterval
调用函数 time_calc
。但它就是这样调用的,没有参数。所以参数 input
没有得到值,所以它是未定义的。
当您尝试将其分配给元素时,它会被翻译成文本 undefined
。
解决这个问题的一种方法是将它包装在一个函数中。这可以是一个匿名函数:
var secs_inc = setInterval(function(){timecalc(20)}, 1000);
打扮得体的例子:
function time_calc(input) {
document.getElementById('input').innerText = input;
}
setInterval(function(){time_calc(20)}, 3000);
<span id="input">Wait for it....</span>
如果你调用setInterval(time_calc(20), 1000)
,你实际上调用了函数time_calc()
,并将结果传递给setInterval。
但是你不能调用它。您需要将函数本身传递给 setInterval,以便 setInterval 稍后可以调用它。这就是为什么在您的原始代码段中您不带括号传递 time_calc
的原因。这只是没有调用的功能。
我所做的是将对 time_calc(20)
的调用包装在另一个也没有参数的(匿名)函数中。现在它是由 setInterval
调用的匿名包装函数,后者又调用 time_calc
并带有 一个参数。
顺便说一句,它不一定是匿名函数。我认为对于这种情况,这是最简单的解决方案,但在他的回答中将实际命名函数声明为 @sudhAnsu63 也应该有效。
试试这样调用你的函数。
var secs_inc = setInterval(new function(){
time_calc(20);}, 1000);
Or
function Calltime()
{
time_calc(20);
}
var secs_inc = setInterval(Calltime, 1000);