Javascript函数参数必须是字符串?

Javascript函数参数必须是字符串?,javascript,Javascript,我是javascript新手,所以我不知道它为什么会这样 我有一个时钟功能: function updateClock() { var currentTime = new Date(); var currentHours = currentTime.getHours(); var currentMinutes = currentTime.getMinutes(); var currentSeconds = currentTime.getSeconds(); var currentMillise

我是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;
}
它是有效的。但是如果我将其更改为
setInterval(updatelock(),1000),它将不起作用。我花了一段时间试图弄明白为什么函数只执行一次,直到我发现我需要在函数调用周围加引号

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

  • 要计算的代码字符串(
    'updatelock()'
    )-这不是首选用法,因为它依赖于
    eval()
    。字符串的计算结果为JavaScript代码
  • 指向函数的指针(
    updatelock
    )-请注意缺少参数。在JavaScript中,通过使用不带
    ()
    的函数名,可以引用而不是调用已定义的函数。指针也可以是一个匿名函数,如
    setInterval(function(){stuff…},time)
    中所述,这实际上与对已定义函数的引用是一样的——两者都指向函数在内存中的位置,不管它是否有名称
  • 因此,在您的情况下,首选的用法是:

    <script type="text/javascript">
      setInterval(updateClock, 1000);
    </script>
    
    
    设置间隔(updateClock,1000);
    
    它的表亲也一样
    setTimeout()

    你试过了吗

    setInterval( updateClock, 1000);
    

    我不认为那样的事情会奏效。我假设调用一个函数需要
    ()
    ,那么你告诉setTimeout“这就是我希望你调用的函数”,而括号的意思是“现在运行此函数,并将结果传递给setTimeout,以便在读取时运行。如果结果不是一个函数,setTimeout将无法对其执行任何操作。+1对问题的良好描述,而不仅仅是提供正确的代码。@jfriend00答案与解决方案不同。我会小心地提供答案。:)因此,仅针对特定函数,我可以引用不带
    ()
    的函数?但是如果不是这样,我仍然使用
    ()
    进行函数调用?我想补充一点,参数在传递之前是经过计算的,所以当你说
    setTimeout(updatelock(),1000)
    时,
    updatelock
    被调用一次,返回值被传递到
    setInterval
    @Ryder-如果你想现在执行函数,你把帕伦斯放在最后
    updatelock()
    立即执行它。如果要将对该函数的引用传递给其他函数,以便它以后可以调用它,则不使用parens
    setTimeout(updatelock,1000)
    setInterval( updateClock, 1000);