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