0

これは私が持っている機能です

FrmLoadingTimerID = setTimeout("UpdateKnl('"+ strType +"')",500);

の値strytypeは文字列です。UpdateKnl メソッドには switch ステートメントがあるため、strtype の後に続けて '' で終了する必要があります。関数と一緒に別のパラメーターを送信したいのですが、適切な方法がありません。

私は次のコードを試しました

FrmLoadingTimerID = setTimeout("UpdateKnl('"+ strType +"',abc)",500);

FrmLoadingTimerID = setTimeout("UpdateKnl('"+ strType +"',+"abc")",500);

どちらの方法でも、abc の値を他の変数に割り当てようとすると、未定義のエラーがスローされるため、値は渡されません。

4

1 に答える 1

2

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渡されたかのように動作します。これは実際にはです。遅延が終了するまでに再割り当てされている可能性があります...したがって、このコードをリファクタリングすることを強くお勧めしますevaleval("(UpdateKnl('" + strType + "', abc))")abc

于 2013-08-08T08:09:28.393 に答える