setTimeout
文字列ではなく関数参照が最初の引数として期待されるため、スニペットはどれも正しくありません。文字列を渡すことができますが、 MDN がそれについて何を言っているかを確認してください:
別の構文の code は、delay ミリ秒後に実行するコードの文字列です (この構文の使用は、eval() の使用と同じ理由で推奨されません)。
私たち全員が知っているように、eval
は悪であり、有効なユースケースはほとんどありません。この場合、ビジネスを進めるためのより良い方法があるため、答えは次のとおりです。
FrmLoadingTimerID = setTimeout(function()
{
//read as UpdateKnl(someVar, 'aString', 123, ['an','array'],{some:'object'});
return UpdateKnl(strType, abc);//pass 2 variables
},500);
JS の変数名に関していくつかの規則があることに注意してください。変数は小文字で始まり、 cammelCasedであり、関数は、関数がコンストラクターでない限り、lowerCaseAndAreCammelCased で始まります。その場合は、UpperCase char で開始します。
とにかく、上記のコードは問題を解決するはずですが、タイムアウトがコールバック関数を呼び出す前の 500 ミリ秒で 2 つの変数のいずれかの値が変更された場合、変更された値が使用されることに注意してください。これを避けるには、iifeを使用してクロージャを作成します。
FrmLoadingTimerID = setTimeout((function(strType, abc)
{// assignes passed arguments to these vars //
return function()
{
return UpdateKnl(strType, abc);//uses arguments of IIFE
};
}(strType, abc)),500);//pass current values of these variables here
タグ wiki を読んでください。この構造がどのように機能するか、なぜそれを使用する必要があるかが説明されています (悪名高いループ問題に似ています)。
何らかの理由で、文字列を に渡すという狂気を維持し、維持したい場合setTimeout
:
setTimeout("UpdateKnl('" + strType + "', 'abc')",500);
これにより、文字列値strType
と文字列定数'abc'
が関数に渡されます。変数の場合abc
、タイムアウト遅延が終了したときに参照する必要があります。
setTimeout("UpdateKnl('" + strType + "', abc)",500);
周りの引用符を削除することにより、タイムアウトの最後に、文字列は:にabc
渡されたかのように動作します。これは実際には悪です。遅延が終了するまでに再割り当てされている可能性があります...したがって、このコードをリファクタリングすることを強くお勧めしますeval
eval("(UpdateKnl('" + strType + "', abc))")
abc