SetTimeout无法正常工作

时间:2012-11-21 07:15:49

标签: javascript

我认为单击按钮后5s后会显示带有OK字符串的弹出窗口,但是单击按钮后会立即显示弹出窗口,为什么?

谢谢!

<html>
<head>
    <title>Wake up call</title>
    <script type="text/javascript">
        function wakeUpCall() { // Function is defined here
            setTimeout(aa("ok"), 5000);
        }

        function aa(bb) {
            alert(bb);
        }
    </script>
</head>
<body bgcolor="lightblue">
    <form>
        <input type="button"
            value="Wake me"
            onclick="wakeUpCall()">
    </form>
</body>
</html>

4 个答案:

答案 0 :(得分:2)

function wakeUpCall() { // Function is defined here
            setTimeout(function(){ alert("ok");}, 5000);
        }

答案 1 :(得分:1)

如果你这样做会怎么样:

<html>
<head>
    <title>Wake up call</title>
    <script type="text/javascript">
        function wakeUpCall() { // Function is defined here
            setTimeout('aa("ok");', 5000);
        }

        function aa(bb) {
            alert(bb);
        }
    </script>
</head>
<body bgcolor="lightblue">
    <form>
        <input type="button"
            value="Wake me"
            onclick="wakeUpCall()">
    </form>
</body>
</html>

注意我引用了要在setTimeout函数中执行的语句。这些引言让你感到困惑,我认为这是一个很好的资源来看看:https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout

另一种方法,我刚刚从上面的资源中学到,就像这样:

function wakeUpCall() { // Function is defined here
    setTimeout(aa, 5000, "Your tekst here");
}

答案 2 :(得分:1)

为此使用匿名函数。

<html>
<head>
    <title>Wake up call</title>
    <script type="text/javascript">
        function wakeUpCall() { // Function is defined here
            setTimeout(function(){aa("ok");}, 5000);
        }

        function aa(bb) {
            alert(bb);
        }
    </script>
</head>
<body bgcolor="lightblue">
    <form>
        <input type="button"
            value="Wake me"
            onclick="wakeUpCall()">
    </form>
</body>
</html>

答案 3 :(得分:1)

你试图以错误的方式去做。

您必须使用setTimeout的回调:

setTimeout(function()
{
    // actual code here
}, 5000);
迈克在他的回答中提供了 - 你可以使用可评估的字符串:

setTimeout('/* actual code here */', 5000);

但强烈建议不要使用他的另一个例子 - 将回调函数作为引用传递并调用回调参数。 但是,您必须记住,如果您使用回调参数,请参阅此section of MDN文章。所有浏览器都不支持回调参数。

就个人而言,我建议使用普通的旧回调,因为这就是使用setTimeout的方式。

仅供参考:

您的代码段不适合您的原因是:

setTimeout(aa('ok'), 5000);
// aa('ok') here is executed, and returns its value, so, in the end, you pass the returned value of aa inside the Timeout.
// and, nor alert alert, nor your function have a "return" statement, so they both will  return always undefined.
// that translates to:

setTimeout(undefined, 5000); // and, that does nothing