2011-12-16 100 views
0

我希望浏览器显示自上次刷新以来的秒数。我不明白为什么 代码1不起作用; 代码2确实; 如果代码1不工作为什么代码3工作?在代码1和代码3中调用setInterval类似。函数的定义方式不同。但是我不清楚为什么这有所作为。有人可以请解释这个JavaScript代码中发生了什么?

非常感谢您的帮助。我刚开始学习JavaScript。

CODE 1

<html> 
<head> 
    <title>Time Since Refresh</title> 
</head> 
<body> 
<br/> 
<br/> 
<span id="timeSinceStart"></span> 

<script language="JavaScript"> 
    var timeRefreshed = new Date(); 
    function displayTimeSinceStart(){ 
     var now = new Date(); 
     //compute elapsed time 
     var elapsed = Math.round((now - timeRefreshed)/1000); 
     document.getElementById("timeSinceStart").innerHTML = "Time Elapsed: " + elapsed + " seconds."; 
    } 

    // Update seconds counter 
    setInterval(displayTimeSinceStart(), 1000); 

</script> 

</body> 
</html> 

CODE 2 同CODE 1,除了0​​函数写为

setInterval("displayTimeSinceStart();", 1000); 

CODE 3

<html> 
<head> 
    <title>Time Since Refresh</title> 
</head> 
<body> 
<br/> 
<br/> 
<span id="timeSinceStart"></span> 

<script language="JavaScript"> 
    var timeRefreshed = new Date(); 
    var timeSinceStart = { 
     displayTimeSinceStart: function(){ 
      var now = new Date(); 
      //compute elapsed time 
      var elapsed = Math.round((now - timeRefreshed)/1000); 
      document.getElementById("timeSinceStart").innerHTML = "Time Elapsed: " + elapsed + " seconds."; 
     } 
    } 

    // Update seconds counter 
    setInterval(timeSinceStart.displayTimeSinceStart, 1000); 

</script> 

</body> 
</html> 

回答

7

代码1电话displayTimeSinceStart(因为"()"),而不是传递一个参考吧:setInterval获取函数(undefined)的返回值。放下括号以修复。

代码2传递一个字符串setInterval来评估:由于您希望在间隔超时时调用该方法,因此需要parens。

代码3传递一个参考,相当于代码1而不"()",所以它的工作原理。

setInterval需要函数引用(首选)或将被评估的字符串。

More details (including why sometimes a method call as a parameter to setTimeout makes sense)

+0

非常感谢。这和你的其他帖子非常有帮助。 – Curious2learn 2011-12-16 12:08:05

2

码1,改变这一行:

setInterval(displayTimeSinceStart(), 1000); 

这样:

setInterval(displayTimeSinceStart, 1000); 

,它应该更新你的时间,每秒一次。您可以在这里看到固定版本的工作:http://jsfiddle.net/jfriend00/sL7HN/

代码2,您传递的字符串将在每个计时器滴答时发送到eval(),并且将正确调用所需的函数。这不是一种理想的编码方式。更好地传递函数方向的引用,而不使用字符串和eval()

代码3,你传递一个函数引用(像我的固定版本的代码1),恰好是一个对象的属性,所以函数将在每个计时器滴答声上调用。

+0

谢谢jfriend00。感谢您的回应。 – Curious2learn 2011-12-16 12:08:23

相关问题