web-dev-qa-db-ja.com

setTimeoutを使用するとすぐにメソッドが実行されるのはなぜですか?

setTimeoutを使用して簡単なコードを記述しようとしていますが、setTimeoutは想定されている時間だけ待機せず、コードはすぐに実行されます。私は何を間違えていますか?

setTimeout(testfunction(), 2000);
54
Adler

関数をすぐに呼び出して、その戻り値をスケジュールしています。

使用する:

setTimeout(testFunction, 2000);
                       ^

注意:括弧はありません。

116
Mat

括弧を削除します

setTimeout(testfunction(), 2000);

関数にパラメーターを送信する場合は、目的の関数を呼び出す匿名関数を作成できます。

setTimeout(function() {

    testfunction('hello');

}, 2000);

編集

誰かが、setTimeoutの最初のパラメーターとして文字列を送信することを提案しました。これに従わず、setTimeoutの最初のパラメーターとして文字列を送信しないことをお勧めします。eval関数が使用されるためです。これは悪い習慣であり、可能であれば避けるべきです。

21
Jose Faeti

テスト関数名の後の括弧を削除します。

setTimeout(testfunction, 2000);

その理由は、setTimeoutの最初の引数は、関数の戻り値ではなく、関数参照である必要があるためです。コードでは、testfunctionがすぐに呼び出され、戻り値がsetTimeoutに送信されます。

6
Emil Vikström

あなたは答えを持っているかもしれませんが、私は原因と解決策を説明しています。必要な時間が経過した後に関数を呼び出すには、2つの方法があります。

1。 setTimeout( "FUNC_NAME() '、TIME_IN_MS);
ここで、二重引用符で囲まれたFUNC_NAMEは、TIME_IN_MSミリ秒後に呼び出したい元の関数です。これは、引用符を付けないとJavaスクリプトが解釈されている間、関数がすぐに実行され、目的が無効になるためです。インタプリタにステートメントをスキップさせるには引用符を付ける必要がありますここに。
2。 setTimeout(function(){FUNC_NAME()}、TIME_IN_MS);
ここでは、時間を評価するのではなく、特定の時間後にifを実行するようにインタープリターに指示する匿名関数が作成されます。

ありがとうshaILU

2
shaILU