6

using という関数に引数を渡したいですsetTimeout。次の 3 つのオプションを見つけました。

A = 1;
// Method 1: closure things
setTimeout(function() { whatsA(A); }, 100);
// Method 2: third argument (same result with [A])
setTimeout(whatsA, 100, A);
// Method 3: eval
setTimeout('whatsA(' + A + ')', 100);
A = 2;
function whatsA(X) { console.log(X); }

これはInternet Explorer 9 の2undefined、およびを示しています。1

方法 1 : 明らかに、引数を渡した後に引数を変更したくありません (確かに単純な整数の場合)。

方法 2 : Internet Explorer だけがサポートされていれば完璧です。

方法 3 : これが唯一の選択肢のようです。しかし、関数ではなく何かを評価するために渡すため、他のものよりもきれいではないようです。

より良い方法はありますか?

4

3 に答える 3

7

私が考えることができる最善の解決策は、次を使用することbind()です:

A = 1;
setTimeout(whatsA.bind(this, A), 100);

は実際には関数呼び出しであるためbind()、現在のA値を読み取り、その値が引数としてバインドされた関数を返します。わかりにくい場合は、次の方法を試してください。

var newFun = whatsA.bind(this, 42);
newFun()

thisこれは一種の嘘であることに注意してください。あなたも安全に通過できwindowます。


最初の方法も受け入れられますが、少し改善する必要があります。

A = 1;
var tmpA = A;
setTimeout(function() { whatsA(tmpA); }, 100);

あなたが観察しているのは、実際には機能であり、バグではありません。setTimeout()ローカル変数を参照するためにクロージャを渡しています。JavaScript は、関数が実際に呼び出される瞬間までその変数へのアクセスを遅らせるのに十分賢いです。変数を変更したため、最新のバージョンが表示されます。


2 番目の方法は非推奨ですどのブラウザでも動作しません.


3 番目の方法は最悪です。文字列を に渡さないでくださいsetTimeout()。常により良い解決策があります。

于 2012-05-13T14:58:19.013 に答える
4

クロージャーを使用できます:

setTimeout((function(A){
               return function(){
                   whatsA(A);
               }; 
            })(A), 100);
于 2012-05-13T14:59:06.277 に答える
0

3つの方法のうち:

オプション1:

setTimeout(function() { whatsA(A); }, 100);

これはどこでも機能し、シンプルです。AsetTimeout関数が呼び出される前に変数が変更される可能性がない限り、これをお勧めします。の値をフリーズする必要がある場合はA、以下のオプション4を参照してください。


オプション2:

setTimeout(whatsA, 100, A);

これは一部のブラウザでのみ機能します。推奨されません。


オプション3:

setTimeout('whatsA(' + A + ')', 100);

これは決してお勧めできません。コードを文字列として作成し、後で評価することは、ほとんどの場合、最善の解決策ではありません。


オプション4をお勧めします:

の値をフリーズするにはA、自己実行関数を使用してクロージャを作成できます。

A = 1;

function(A) {
    setTimeout(function() {whatsA(A);}, 100);
}(A);

A = 2;
function whatsA(X) { console.log(X); }
于 2012-05-13T15:10:53.730 に答える