2011-12-31 10 views
2

私はthis questionを見ましたが、私はこれに何が問題なのでしょうか?setTimeOutパラメータで関数を実行

var id = 12; 
setTimeout(showGrid ('i want to pass variable ' + id + ' here'), 5000); 

私は上記のコードが良い解決策ではないことに興味があります。私はChromeをインストールしただけで、試してみました。ブラウザの問題はありますか?

なぜ匿名機能が優れているのですか?

答えて

5

と小oに気づくあなたはクロージャを使用することができます。

var id = 12; 
setTimeout(function() { 
    showGrid('i want to pass variable ' + id + ' here'); 
}, 5000); 

そして、ここではlive demoです。コメントから

編集(ミロ):

setTimeout関数は、コールバックまたは文字列変数を期待しています。あなたはあなたのコードが無効であるようにそのようなものを渡すことはありません。どのように動作するはずでないshowGrid関数を直接呼び出しています。 showGrid関数は5秒後に呼び出す必要があります。

+0

あなたはそれを閉鎖することができます。それとも、それはよくあるのですか? –

+0

いいですが、これはなぜより良いですか?他のコードスニペットの問題は何ですか? – Bakudan

+0

@Milo、他のコードスニペット?あなたの質問に表示されているものは?はいの場合、質問に表示されているスニペットは機能しません。 –

2

setTimoutは、最初の引数として関数を、2番目の引数として時間を、次に関数に渡すオプションの引数を求めます。

function showGrid(str) { 
    return str; 
} 

とあなたがsetTimeoutを以下している:あなたが機能している場合ので、

setTimeout(showGrid("..."), 5000); 

を、それはこのように終わるので、あなたは、showGridを呼び出し、setTimeoutに戻り値を渡している。

// "..." is returned from showGrid("...") 
setTimeout("...", 5000); 

および"..."は機能ではありません。ですから、これを回避するには2つの方法があります(ダーリンの答えのように)エンクロージャーを作るか、時間の後に引数を追加することができます。

setTimeout(function() { 
    showGrid("..."); 
}, 5000); 

// same thing 
setTimeout(showGrid, 5000, "..."); 

例:http://jsfiddle.net/fFg57/

+0

ベアフル。すべてのIEバージョンで動作するわけではありません。そのため、別の関数を返す関数を使用する方が良い理由です。これは、evalが安全でない可能性があるため、文字列を渡すよりも優れています。 –

1
var id = 12; 
setTimeout("showGrid ('i want to pass variable " + id + " here')", 5000); 

最初のパラメータはずっとあなたがeval関数に渡すだろうかのように、文字列を取ります。 setTimeout

関連する問題