为什么我使用setTimeout时会立即执行该方法?

时间:2011-08-21 09:17:15

标签: javascript

我正在尝试使用setTimeout编写一个简单的代码,而setTimeout只是不会等到它想要的时间并且代码立即执行。 我做错了什么?

 $("#btn1").click(function () {
    if ("something") {
        $("#div1").slideUp();
        setTimeout(testfunction(), 2000);
    }
 }

7 个答案:

答案 0 :(得分:116)

您正在立即调用该函数并安排其返回值。

使用:

setTimeout(testFunction, 2000);
                       ^

注意:没有parens。

答案 1 :(得分:21)

删除括号

setTimeout(testfunction(), 2000);

如果要将参数发送到函数,可以创建一个匿名函数,然后调用所需的函数。

setTimeout(function() {

    testfunction('hello');

}, 2000);

修改

有人建议发送一个字符串作为setTimeout的第一个参数。我建议不要遵循这个并且永远不要将字符串作为setTimeout的第一个参数发送,因为将使用eval函数。这是不好的做法,如果可能应该避免。

答案 2 :(得分:6)

删除测试功能名称后的括号:

setTimeout(testfunction, 2000);

原因是setTimeout的第一个参数应该是函数 reference ,而不是函数的返回值。在您的代码中,立即调用testfunction,并将返回值发送到setTimeout。

答案 3 :(得分:2)

嗯,你可能得到了答案,但我正在解释原因和解决方案。有两种方法可以在需要的时间后调用功能。

1. setTimeout(“FUNC_NAME()',TIME_IN_MS);
   这里的双引号内的FUNC_NAME是您想要在TIME_IN_MS毫秒之后调用的原始函数。这是因为如果你没有引用引号,那么当java脚本被解释时,函数会立即执行,你的目的就会失败。为了让口译员跳过这个陈述,我们需要在这里加上引号 2. setTimeout(function(){FUNC_NAME()},TIME_IN_MS);
   这里创建匿名函数,告诉解释器在一定时间后执行而不是评估时间。

由于 shaILU

答案 4 :(得分:2)

首先删除括号:

setTimeout(testfunction, 2000);

然后,如果要在setTimeout函数中传递参数,则可以通过以下方式传递:

 setTimeout(testfunction, 2000, param1, param2);

注意:您可以根据功能要求传递多个参数。

答案 5 :(得分:0)

删除括号,当前您正在立即调用该函数。当前传递给setTimeout的是testfunction()调用返回的值,但是您应该传递给setTimeout的第一个参数是函数引用

setTimeout(testfunction, 2000);

答案 6 :(得分:-1)

var getMovieDetails = (function getMovieDetails(movieID) {
    $.getJSON(
        "https://www.omdbapi.com/?",
        { apikey: "af2beff5", i: movieID },
        (movieData) => {
            if (movieData.Response != "True") {
                console.error(movieData.Error);
                return;
            }
            $(poster).attr("src", movieData.Poster);
            $(title).html(movieData.Title);
            $(releasedRating).html(movieData.Year + " | " + movieData.imdbRating);
            $(runtimeGenre).html(movieData.Runtime + " | " + movieData.Genre);
            $(director).html(movieData.Director);
            $(actors).html(movieData.Actors);
            $(plot).html(movieData.Plot);
        }
    );
})

setTimeout(getMovieDetails, 3000);