3

我是 javascript 新手,所以我不确定它为什么会这样。

我有一个时钟功能:

function updateClock()
{
var currentTime = new Date();

var currentHours = currentTime.getHours();
var currentMinutes = currentTime.getMinutes();
var currentSeconds = currentTime.getSeconds();
var currentMilliseconds = currentTime.getMilliseconds();

// Pad the minutes and seconds with leading zeros, if required
currentMinutes = ( currentMinutes < 10 ? "0" : "" ) + currentMinutes;
currentSeconds = ( currentSeconds < 10 ? "0" : "" ) + currentSeconds;

// Choose either "AM" or "PM" as appropriate
var timeOfDay = ( currentHours < 12 ) ? "AM" : "PM";

// Convert the hours component to 12-hour format if needed
currentHours = ( currentHours > 12 ) ? currentHours - 12 : currentHours;

// Convert an hours component of "0" to "12"
currentHours = ( currentHours == 0 ) ? 12 : currentHours;

// Update the time display
document.getElementById("clock").innerHTML = currentHours + ":" + currentMinutes + ":" + currentSeconds + " " + timeOfDay;
}

这是在一个单独的clock.js文件中。我将该文件包含在头中。

我把它放在下面clock div

<script type="text/javascript">
setInterval("updateClock()", 1000);
</script>

它有效。但是,如果我将其更改为setInterval(updateClock(), 1000);,它将无法正常工作。我花了一段时间试图弄清楚为什么函数只执行一次,直到我发现我需要在函数调用周围加上引号。

来自不同的语言背景,我不知道你为什么需要在它周围加上引号?看起来我正在将字符串传递"updateClock()"给函数而不是另一个函数。我看到其他人的代码,他们只是将整个函数定义为参数,例如setInterval(function(){ ... }, 1000).

4

2 回答 2

8

setInterval()将其作为第一个参数

  1. 要评估的代码字符串 ( 'updateClock()') - 这不是首选用途,因为它依赖于eval(). 该字符串被评估为 JavaScript 代码。
  2. 指向函数的指针 ( updateClock) - 注意缺少括号。在 JavaScript 中,一个定义的函数可以被引用,而不是被调用,通过使用它的名字而不带(). 指针也可以是 中的匿名函数setInterval(function(){stuff...}, time),这实际上与对已定义函数的引用相同——两者都指向函数在内存中的位置,无论它是否有名称。

因此,在您的情况下,首选用法是:

<script type="text/javascript">
  setInterval(updateClock, 1000);
</script>

它的表弟也是如此setTimeout()

于 2012-04-20T20:45:21.510 回答
1

你有没有尝试过

setInterval( updateClock, 1000);
于 2012-04-20T20:45:25.427 回答