2010-12-02 19 views
1

私はJavaScript実行キューから出てくるスクリプトがあります。私はカップルの方法でこれを行うことができることを発見しました。Javascript非同期実行キューとsetTimeout?

alert();//of course we can't use this one. 

setTimeout(function(){ 
    someScript();//works, but are there vulnerabilites? 
}, 1); 

その他の方法にはどのようなものがありますか?また、javascript実行キューから出てくる正しい方法は何ですか?

setTimeoutが最適なオプションである場合、setTimeoutの脆弱性は何ですか?可能性のある将来の問題、タイムアウトのコードが呼び出されない可能性、スピードの問題などがありますか?

+0

バンプアウトの意味が不明です。また、「ここでjQueryを使用する」というあなたのコメントでは、jQueryではありません。これはちょうど普通のJavaScriptであり、jqueryは必要ありません。 – Matt

+0

「脆弱性」とは、注意すべきことを尋ねていますか? (可変スコープ、コンテキストなど) – zzzzBov

+0

@Matt、ブラウザはJavaScript呼び出しを待ちます。バンプを出すことで、キューから抜け出し、再キューすることができます。コメントは、私が呼び出す関数の内容です。この例では削除するのを忘れました。 – UpHelix

答えて

3

setTimeoutは、実行フローを中断する一般的な方法です。 alert()は同じものではなく、同期しています - OKを押すまでコードを停止し、中断したところから再開します。 setTimeoutを使用すると、スレッドが解放されて別のコードセクションが実行されます。

唯一の脆弱性は、自分が行っていることを知らないことです。非同期のコーディングは、コーディングの同期よりもややこしいです。 「this」を使用するとうまく動作しないため、コンテキストを監視する必要があります。

object = { 
    firstMethod: function(){ 
     setTimeout(function(){ 
      this.secondMethod(); // won't work! 
     }, 30); 
    }, 
    secondMethod: function(){} 
} 
+1

あなたの答えは、タイムアウト関数のコンテキストから 'secondMethod'を実行する方法がないと解釈できます。それが可能であることを反映するために更新することをお勧めします。 – alex

1

基本的には、現在のスタックを実行していない、つまり非同期的に実行しています。 setTimeout()はこの場合の方法で、setTimeout()の後のコードはコールバック関数の前に実行されます。

setTimeout()内の1msは、実際には1msのインターレスは動作しません。あなたが通常得ることができる最も速いのは、私の経験では約10msです。

1

setTimeoutはそれを行う方法です。 2番目のパラメータがタイムアウトであることに注意してください。ミリ秒秒ではありません。

関連する問題