set Timeout非同期実行

1813 ワード

以下のコードは循環したいです.刃の出力結果は01234です.出力結果が正しいかどうか、正しくないなら、なぜ循環内のコードを修正して正しい結果を出力しますか?
for(var i=0;i<5;++i){
  setTimeout(function(){
      console.log(i);
  },1000);
}
で調べた資料は?
 JavaScriptは単一スレッドで実行されていますので、複数のコードを同時に実行することはできません.あるコードが実行されているとき、後続のすべてのタスクは待ち行列を形成しなければなりません.現在のタスクが完了すると、次のタスクがキューから取り出されます.これはしばしば「ブロック実行」と呼ばれます.マウスを一回クリックしたり、タイマーが到着したり、Ajax要求が完了したら、コールバック関数が起動されます.これらのイベント処理プログラムやコールバック関数はすぐに実行されません.すぐにキューに並べば、スレッドが空き次第に実行されます.現在JavaScriptスレッドが実行中である場合、時間がかかるコードがマウスクリックで発生した場合、イベントハンドラがブロックされ、ユーザーがフィードバックをすぐに見ることができません.イベントハンドラは前のコードが終了するまで、タスクキューに入れられます.コードにsetTimeoutが設定されている場合、ブラウザは適切な時間にコードをタスクキューに挿入します.この時間を0にすると、直ちにキューに挿入することを表しますが、すぐに実行するのではなく、前のコードの実行が完了するまで待ちます.したがって、setTimeoutは実行時間が保証されていません.JavaScriptスレッドが混雑しているかそれともアイドル状態かによって、タイムリーに実行されるかは異なります.
このテーマはJavaScriptのシングルスレッドとset Timeoutの非同期特性を考察します.
【注】:JavaScriptエンジンは単一スレッドで実行されています.ブラウザの実行中は一つのスレッドだけがjsプログラムを実行しています.ブラウザのカーネルはマルチスレッドであり、彼らはカーネルコントロールの下で互いに協力して、同期を維持する.一つのブラウザは少なくとも三つの常駐スレッドを実現する.JavaScriptエンジンスレッド、GUIレンダリングスレッド、ブラウザイベントトリガスレッド.
  • JavaScriptエンジンはイベントドライバの単一スレッドに基づいて実行され、Jsエンジンは常にジョブキュー中のタスクの到来を待っています.そして処理します.ブラウザはいつでもjsスレッドだけがjsプログラムを実行しています.
  • GUIレンダリングスレッドは、ブラウザのインタフェースのレンダリングを担当しています.インターフェースが再描画される必要があるときや、ある操作によってフィードバックが生じると、GUIレンダリングスレッドとjsエンジンは相互に反発しています.Jsエンジンが実行されると、GUIスレッドは保留され、GUI更新はキューに保存されます.
  • イベントトリガスレッドは、イベントがトリガされると、処理対象のキューの最後にイベントを追加し、jsエンジンの処理を待つ.これらのイベントは、jsエンジンが現在コードブロックを実行しており、setTimeoutのようなブラウザカーネルからの他のスレッド、マウスクリック、ajax非同期要求などがありますが、jsのシングルスレッド関係のために、これらのイベントはすべてjsエンジン処理を待ち続けなければなりません.
  • は、スレッドに同期コードがないという前提で非同期コードを実行する.
  • --以上の情報はhttps://www.zhihu.com/people/fredshare.
    正しい書き方は
    for(var i =0; i <10; i++){
     (function(e){
      setTimeout(function(){
       console.log(e); 
      },1000);
     })(i);
    }