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


74

我正在尝试使用编写一个简单的代码setTimeout,但setTimeout只是不愿等待该时间而该代码立即执行。我究竟做错了什么?

setTimeout(testfunction(), 2000);

()在此充当调用运算符。但是您想将该函数传递给setTimeout,而不是调用它。
西米·维达斯

Answers:


134

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

采用:

setTimeout(testFunction, 2000);
                       ^

注意:没有原谅。


3
好的,谢谢..但是有一种方法可以将参数发送给setTimeout(testFunction(obj),2000)之类的函数吗?顺便说一句,这太行不通了setTimeout(alert(“ test”),2000)..
Adler

29
@Adler:是的:setTimeout(function() { alert("test"); }, 2000);
TJ Crowder

2
@Adler:可以这样做,setTimeout(alert, 2000, "test")但是IE不支持。
pimvdb


27

删除括号

setTimeout(testfunction(), 2000);

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

setTimeout(function() {

    testfunction('hello');

}, 2000);

编辑

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


9

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

setTimeout(testfunction, 2000);

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


好的,谢谢..但是有一种方法可以将参数发送给setTimeout(testFunction(obj),2000)之类的函数吗?顺便说一句,这太行不通了setTimeout(alert(“ test”),2000)...
Adler

2

好吧,您可能已经找到了答案,但是我正在解释原因和解决方案。在所需的时间后,可以通过两种方式调用函数。

1. setTimeout(“ FUNC_NAME()',TIME_IN_MS);
这里双引号内的FUNC_NAME是您要在TIME_IN_MS毫秒后调用的原始函数。这是因为如果您不加引号,则在解释Java脚本时该函数将立即执行,您的目的就会被打败。要让解释器跳过该语句,我们需要在此处加上引号
2. setTimeout(function(){FUNC_NAME()},TIME_IN_MS);
这里创建了一个匿名函数,告诉解释器执行在一定时间后而不是评估时间。

谢谢shaILU


2

首先删除括号:

setTimeout(testfunction, 2000);

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

 setTimeout(testfunction, 2000, param1, param2);

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


0

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

setTimeout(testfunction, 2000);

-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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.