Javascript setInterval() - 为什么我的“输入”参数更改为undefined?

时间:2015-11-14 06:57:38

标签: javascript setinterval

我一直在研究下面的代码但是无法弄清楚为什么我的函数参数“input”在1秒后变为undefined?

以下是代码:

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

2 个答案:

答案 0 :(得分:3)

您期望它是什么?您使用time_calc在一秒钟后调用函数setInterval。但它被称为就是这样,没有参数。因此,参数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也应该有效。

答案 1 :(得分:0)

尝试像这样调用你的函数。

 var secs_inc = setInterval(new function(){
                               time_calc(20);}, 1000);

Or

function Calltime()
{
 time_calc(20);
}

 var secs_inc = setInterval(Calltime, 1000);