有谁可以请解释这个JavaScript代码中发生了什么?

时间:2011-12-16 03:08:13

标签: javascript

我希望浏览器显示自上次刷新以来的秒数。我不明白为什么 代码1不起作用; 守则2; 如果代码1不起作用,为什么代码3有效? setInterval调用在CODE 1和CODE 3中类似。函数的定义方式不同。但我不清楚为什么会有所作为。

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

代码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>

代码2 与CODE 1相同,但setInterval()函数写为

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

代码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>

2 个答案:

答案 0 :(得分:7)

代码1 调用 displayTimeSinceStart(因为"()")而不是传递对它的引用:setInterval获取返回该函数的值(undefined)。删除括号以修复。

代码2 传递setInterval的字符串进行评估:由于您希望在间隔超时时调用该方法,因此需要填充。

代码3 传递一个引用,相当于没有"()"代码1 ,所以它可以工作。

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

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

答案 1 :(得分:2)

代码1 中,更改此行:

setInterval(displayTimeSinceStart(), 1000);

到此:

setInterval(displayTimeSinceStart, 1000);

它应该每秒更新一次。您可以在此处查看固定版本:http://jsfiddle.net/jfriend00/sL7HN/

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

代码3 中,您传递的函数引用(如我的代码1的固定版本)恰好是对象的属性,因此将在每个计时器tick上调用该函数。 / p>