如何使用setTimeout调用带有参数的javascript函数

dlo*_*loh 3 javascript

以下功能每5秒显示一次警报:

function foo() {
    bar="foo";
    alert (bar);

    setTimeout(foo, 5000);
}

foo();
Run Code Online (Sandbox Code Playgroud)

但是,当我向函数添加参数并从中调用时setTimeout,它不再等待5秒,它只是无休止地发出警报而没有任何延迟:

function foo(bar) {
    bar="foo";
    alert (bar);

    setTimeout(foo(bar), 5000);
}

foo();
Run Code Online (Sandbox Code Playgroud)

为什么这样,我怎样才能在传递参数时延迟遍历函数?

Two*_*aws 7

JavaScript认为你想foo(bar)立即调用然后将其结果传递给setTimeout(),这不是你的意思.相反,您应该在其中创建一个匿名函数,如下所示:

function foo(bar) {
    bar = "foo";
    alert(bar);

    setTimeout(function() {
        foo(bar)
    }, 5000);
}
Run Code Online (Sandbox Code Playgroud)


Jos*_*ier 6

它不起作用,因为您在使用时调用该函数setTimeout(foo(bar), 5000).

您可以使用该.bind()方法传递bar变量:

setTimeout(foo.bind(this, bar), 5000);
Run Code Online (Sandbox Code Playgroud)

第一个参数是this要传递给函数的值.它可以是null,如果你不需要它.以下参数是传递的参数.在这种情况下,bar是第一个参数.


Min*_*our 5

您可以使用参数参数(在第二个参数之后):

setTimeout(foo, 5000, bar);
Run Code Online (Sandbox Code Playgroud)

基本上,第二个参数之后的任何参数都传递给第一个参数中提供的函数.