2015-11-14 238 views
-1

我一直工作在下面的代码,但无法弄清楚,为什么在1秒钟后做我的函数参数“输入”更改为未定义?Javascript setInterval() - 为什么我的“输入”参数更改为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> 

回答

3

你还指望它呢?您在使用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的函数也应该起作用。

+0

这工作,但再次我有另外一个小问题: 使用匿名函数时和预期不起作用使用这个时候为什么没有给出正确的输出: 的setInterval(time_calc(20),1000); 两个都不一样吗? – saadi123

+0

不一样。我在答案的底部添加了一个解释。 – GolezTrol

0

尝试调用你的这个功能。

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

Or 

function Calltime() 
{ 
time_calc(20); 
} 

var secs_inc = setInterval(Calltime, 1000); 
相关问题